`
holoblog
  • 浏览: 1225357 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18899
文章分类
社区版块
存档分类
最新评论

浅析C# TCP协议

 
阅读更多

TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在。net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序。

C#基于TCP协议的网络通讯

要进行C#基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分——主机名和端口,如www.yesky.com:80中, www.yesky.com就是主机名,80指主机的80端口,当然,主机名也可以用IP地址代替。当连接建立之后,就可以使用这个连接去发送和接收数据包,TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来。

在。net framework的类库(Class Library)中,提供了两个用于TCP网络通讯的类,分别是TcpClient和TcpListener.由其英文意义显而易见,TcpClient 类是基于TCP协议的客户端类,而TcpListener是服务器端,监听(Listen)客户端传来的连接请求。TcpClient类通过TCP协议与服务器进行通讯并获取信息,它的内部封装了一个Socket类的实例,这个Socket对象被用来使用TCP协议向服务器请求和获取数据。因为与远程主机的交互是以数据流的形式出现的,所以传输的数据可以使用。net framework中流处理技术读写。在我们下边的例子中,你可以看到使用NetworkStream类操作数据流的方法。

在下面的例子中,我们将建立一个时间服务器,包括服务器端程序和客户端程序。服务器端监听客户端的连接请求,建立连接以后向客户端发送当前的系统时间。

先运行服务器端程序,下面截图显示了服务器端程序运行的状况:

然后运行客户端程序,客户端首先发送连接请求到服务器端,服务器端回应后发送当前时间到客户端,这是客户端程序的截图:

发送完成后,服务器端继续等待下一次连接:

通过这个例子我们可以了解TcpClient类的基本用法,要使用这个类,必须使用System.Net.Socket命名空间,本例用到的三个命名空间如下:

using System;
using System.Net.Sockets;
using System.Text;
//从字节数组中获取字符串时使用该命名空间中的类
//首先讨论一下客户端程序,开始我们必须初始化一个TcpClient类的实例:

TcpClient client = new TcpClient(hostName, portNum);
//然后使用TcpClient类的GetStream()方法获取数据流,
并且用它初始化一个NetworkStream类的实例:
NetworkStream ns = client.GetStream();


注意,当使用主机名和端口号初始化TcpClient类的实例时,直到跟服务器建立了连接,这个实例才算真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,服务器端口未开放等等原因而不能连接,程序将抛出异常并且中断执行。

建立数据流之后,我们可以使用NetworkStream类的Read()方法从流中读取数据,使用Write()方法向流中写入数据。读取数据时,首先应该建立一个缓冲区,具体的说,就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下:

public override int Read(in byte[] buffer,int offset,int size)
buffer是缓冲数组,offset是数据(字节流)在缓冲数组中存放的开始位置,size是读取的字节数目,返回值是读取的字节数。在本例中,简单地使用该方法来读取服务器反馈的信息:

byte[] bytes = new byte[1024];//建立缓冲区
int bytesRead = ns.Read(bytes, 0, bytes.Length);//读取字节流
// 然后显示到屏幕上:
Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));
//最后不要忘记关闭连接:
client.Close();

分享到:
评论

相关推荐

    浅析C#编程中的内存管理

    浅析C#编程中的内存管理浅析C#编程中的内存管理

    浅析C#委托和事件实例

    浅析C#委托和事件实例 当第一次听到委托、事件时感觉比较抽象、很好奇,当看到老师在课堂上利用委托和事件实现两个窗体调用时、感觉委托太神奇了,呵、不废话了……  C#委托和事件在做程序是很常见到的,对于像我...

    浅析C#中object-sender与EventArgs-e

    浅析C#中object_sender与EventArgs_e

    TCP协议及工作原理浅析

    虽然TCP/IP协议并不完全符合OSI的七层参考模型,但TCP/IP通讯协议采用的4层层级结构从一开始便成为了业界的实际标准。传输控制协议TCP是TCP/IP协议栈中的传输层协议,提供可靠的数据流发送和到应用程序的虚拟连接...

    浅析C# 内存管理

    本文浅析了windows和C#的内存管理的机制,介绍了基本的内存管理方法

    浅析C#中的文件操作

    浅析C#中的文件操作 个人学习参考之用 与大家分享

    浅析C#中的图形编程

    像Java一样,C#提供了一整套相当丰富的类库、方法以及事件以供开发者使用。C#还引入了GDI+,它是由GDI演变而来的,具有比GDI更强大的功能而且简化了程序员的编程工作。所以开发者运用这些,就可以很方便的开发出...

    TCP/IP协议栈浅析

    (自己公司同事写的PPT) TCP/IP协议栈的历史 TCP/IP协议栈的设计思想 IP协议 UDP协议 TCP协议,状态机 TCP定时器,滑动窗口

    浅析C# 状态机Stateless

    主要介绍了C# 状态机Stateless的的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    C#通信编程(TCP/UDP)

    基于C#语言的通信编程资料,浅析TCP/UDP在C#中的实现,以及SOCKET套接字的分析

    浅析C#中的套接字编程.docx

    浅析C#中的套接字编程.docx,文章,不错

    浅析C# 中object sender与EventArgs e

    了解C#中的预定义事件处理机制 在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理。 EventArgs是包含事件数据的类的基类,用于传递事件的细节。 EventHandler是一个委托声明如下 ...

    浅析C#中object sender与EventArgs e

    在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理。 EventArgs是包含事件数据的基类,用于传递事件的细节。 EventHandler是一个委托声明如下 public delegate void EventHandler...

    浅析C#图形编程

    C#提供了一整套相当丰富的类库、方法以及事件以供开发者使用。C#还引入了GDI+,它是由GDI演变而来的,具有比GDI更强大的功能而且简化了程序员的编程工作。所以开发者运用这些,就可以很方便的开发出具有强大图形...

    浅析C#异步操作

    C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。

    ADB通讯协议浅析

    ADB通讯协议分析,利用USB分析仪抓取ADB通讯过程中的数据并结合ADB源码进行分析ADB通讯协议,对于理解ADB底层协议有很好的帮助。

    浅析STP协议.ppt

    浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt浅析STP协议.ppt

    浅析无线应用协议(WAP).pdf

    浅析无线应用协议(WAP)pdf,浅析无线应用协议(WAP)

Global site tag (gtag.js) - Google Analytics