专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » tcp网络协议:C#实现基于TCP协议的网络通讯 »正文

tcp网络协议:C#实现基于TCP协议的网络通讯

来源: 发布时间:星期四, 2009年2月12日 浏览:81次 评论:0


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

要进行基于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类基本使用方法要使用这个类必须使用.Net.Socket命名空间本例用到 3个命名空间如下:

using ; using .Net.Sockets; using .Text;//从字节中获取串时使用该命名空间中

首先讨论下客户端开始我们必须个TcpClient类例子:

TcpClient client = TcpClient(hostName, portNum);

然后使用TcpClient类GetStream思路方法获取数据流并且用它个NetworkStream类例子:

NetworkStream ns = client.GetStream;

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

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

public override Read(in buffer, off, size)

buffer是缓冲off是数据(字节流)在缓冲中存放开始位置size是读取字节数目返回值是读取字节数在本例中简单地使用该思路方法来读取服务器反馈信息:

 s = [1024];//建立缓冲区  sRead = ns.Read(s, 0, s.Length);//读取字节流

然后显示到屏幕上:

Console.WriteLine(Encoding.ASCII.GetString(s,0,sRead));

最后不要忘记关闭连接:

client.Close;



下面是本例完整清单:

using ; using .Net.Sockets; using .Text;

 TcpClientExample { public TcpTimeClient { private const portNum = 13;//服务器端口可以随意修改 private const hostName = "127.0.0.1";//服务器地址127.0.0.1指本机

[STAThread]  void Main( args) { try { Console.Write("Try to connect to "+hostName+":"+portNum.+"\r\n"); TcpClient client = TcpClient(hostName, portNum); NetworkStream ns = client.GetStream;  s = [1024];  sRead = ns.Read(s, 0, s.Length);

Console.WriteLine(Encoding.ASCII.GetString(s,0,sRead));

client.Close; Console.ReadLine;//由于是控制台故为了清楚看到结果可以加上这句

} catch (Exception e) { Console.WriteLine(e.); } } } }

上面这个例子清晰地演示了客户端编写要点下面我们讨论下如何建立服务器这个例子将使用TcpListener类在13号端口监听旦有客户端连接将立即向客户端发送当前服务器时间信息

TcpListener关键在于AcceptTcpClient思路方法该思路方法将检测端口是否有未处理连接请求如果有未处理连接请求该思路方法将使服务器同客户端建立连接并且返回个TcpClient对象通过这个对象GetStream思路方法建立同客户端通讯数据流事实上TcpListener类还提供个更为灵活思路方法AcceptSocket当然灵活代价是复杂对于比较简单AcceptTcpClient已经足够用了此外TcpListener类提供Start思路方法开始监听提供Stop思路方法停止监听

首先我们使用端口个TcpListener例子并且开始在13端口监听:

private const portNum = 13; TcpListener listener = TcpListener(portNum); listener.Start;//开始监听

如果有未处理连接请求使用AcceptTcpClient思路方法进行处理并且获取数据流:

TcpClient client = listener.AcceptTcpClient; NetworkStream ns = client.GetStream;

然后获取本机时间并保存在字节使用NetworkStream.Write思路方法写入数据流然后客户端就可以通过Read思路方法从数据流中获取这段信息:

 Time = Encoding.ASCII.GetBytes(DateTime.Now.); ns.Write(Time, 0, Time.Length); ns.Close;//不要忘记关闭数据流和连接 client.Close;

服务器端完整清单如下:

using ; using .Net.Sockets; using .Text;

 TimeServer {  TimeServer { private const portNum = 13;

[STAThread]  void Main( args) { bool done = false; TcpListener listener = TcpListener(portNum); listener.Start; while (!done) { Console.Write("Waiting for connection..."); TcpClient client = listener.AcceptTcpClient;

Console.WriteLine("Connection accepted."); NetworkStream ns = client.GetStream;

 Time = Encoding.ASCII.GetBytes(DateTime.Now.);

try { ns.Write(Time, 0, Time.Length); ns.Close; client.Close; } catch (Exception e) { Console.WriteLine(e.); } }

listener.Stop; } } }

把上面两段分别编译运行OK我们已经用C#实现了基于TCP协议网络通讯如何样?很简单吧!

使用上面介绍基本思路方法我们可以很容易编写出些很有用如FTP电子邮件收发点对点即时通讯等等你甚至可以自己编制个QQ来!

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: