用c#完成基于tcp协议地网络通讯

上传人:子 文档编号:43378475 上传时间:2018-06-05 格式:DOC 页数:5 大小:28.50KB
返回 下载 相关 举报
用c#完成基于tcp协议地网络通讯_第1页
第1页 / 共5页
用c#完成基于tcp协议地网络通讯_第2页
第2页 / 共5页
用c#完成基于tcp协议地网络通讯_第3页
第3页 / 共5页
用c#完成基于tcp协议地网络通讯_第4页
第4页 / 共5页
用c#完成基于tcp协议地网络通讯_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《用c#完成基于tcp协议地网络通讯》由会员分享,可在线阅读,更多相关《用c#完成基于tcp协议地网络通讯(5页珍藏版)》请在金锄头文库上搜索。

1、用用 C#C#完成基于完成基于 TCPTCP 协议地网络通讯协议地网络通讯本文由默也蓝贡献doc 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。TCP 协议是一个基本的网络协议,基本上所有的网络服务都是基于 TCP 协议的,如 HTTP,FTP 等等,所以 要了解网络编程就必须了解基于 TCP 协议的编程。然而 TCP 协议是一个庞杂的体系,要彻底的弄清楚它 的实现不是一天两天的功夫,所幸的是在.net framework 环境下,我们不必要去追究 TCP 协议底层的实现, 一样可以很方便的编写出基于 TCP 协议进行网络通讯的程序。 要进行基于 TCP

2、协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分主 机名和端口,如 :80 中, 就是主机名,80 指主机的 80 端口,当然,主机名 也可以用 IP 地址代替。当连接建立之后,就可以使用这个连接去发送和接收数据包,TCP 协议的作用就是 保证这些数据包能到达终点并且能按照正确的顺序组装起来。 在.net framework 的类库(Class Library)中,提供了两个用于 TCP 网络通讯的类,分别是 TcpClient 和 TcpListener。由其英文意义显而易见,TcpClient 类是基于 TCP 协议的客户端类,而 TcpListener 是服务 器端,

3、监听(Listen)客户端传来的连接请求。TcpClient 类通过 TCP 协议与服务器进行通讯并获取信息,它 的内部封装了一个 Socket 类的实例,这个 Socket 对象被用来使用 TCP 协议向服务器请求和获取数据。因 为与远程主机的交互是以数据流的形式出现的,所以传输的数据可以使用.net framework 中流处理技术读 写。在我们下边的例子中,你可以看到使用 NetworkStream 类操作数据流的方法。 在下面的例子中,我们将建立一个时间服务器,包括服务器端程序和客户端程序。服务器端监听客户 端的连接请求,建立连接以后向客户端发送当前的系统时间。 先运行服务器端程序,下

4、面截图显示了服务器端程序运行的状况:然后运行客户端程序,客户端首先发送连接请求到服务器端,服务器端回应后发送当前时间到客户端, 这是客户端程序的截图:发送完成后,服务器端继续等待下一次连接:通过这个例子我们可以了解 TcpClient 类的基本用法,要使用这个类,必须使用 System.Net.Socket 命名 空间,本例用到的三个命名空间如下:using System; using System.Net.Sockets; using System.Text;/从字节数组中获取字符串时使用该命名空间中的类 首先讨论一下客户端程序,开始我们必须初始化一个 TcpClient 类的实例:TcpC

5、lient client = new TcpClient(hostName, portNum); 然后使用 TcpClient 类的 GetStream()方法获取数据流,并且用它初始化一个 NetworkStream 类的实例:NetworkStream ns = client.GetStream();注意,当使用主机名和端口号初始化 TcpClient 类的实例时,直到跟服务器建立了连接,这个实例才算 真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,服务器端口未开放等等原因而不能连 接,程序将抛出异常并且中断执行。 建立数据流之后,我们可以使用 NetworkStream 类的

6、 Read()方法从流中读取数据,使用 Write()方法向 流中写入数据。读取数据时,首先应该建立一个缓冲区,具体的说,就是建立一个 byte 型的数组用来存放 从流中读取的数据。Read()方法的原型描述如下:public override int Read(in byte buffer,int offset,int size) buffer 是缓冲数组,offset 是数据(字节流)在缓冲数组中存放的开始位置,size 是读取的字节数目, 返回值是读取的字节数。在本例中,简单地使用该方法来读取服务器反馈的信息:byte bytes = new byte1024;/建立缓冲区 int by

7、tesRead = ns.Read(bytes, 0, bytes.Length);/读取字节流 然后显示到屏幕上:Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead); 最后不要忘记关闭连接:client.Close(); 下面是本例完整的程序清单:using System; using System.Net.Sockets; using System.Text;namespace TcpClientExample public class TcpTimeClient private const int portNum =

8、 13;/服务器端口,可以随意修改 private const string hostName = “127.0.0.1“;/服务器地址,127.0.0.1 指本机STAThread static void Main(string args) try Console.Write(“Try to connect to “+hostName+“:“+portNum.ToString()+“rn“);TcpClient client = new TcpClient(hostName, portNum); NetworkStream ns = client.GetStream(); byte byte

9、s = new byte1024; int bytesRead = ns.Read(bytes, 0, bytes.Length);Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead);client.Close(); Console.ReadLine();/由于是控制台程序,故为了清楚的看到结果,可以加上这句 catch (Exception e) Console.WriteLine(e.ToString(); 上面这个例子清晰地演示了客户端程序的编写要点,下面我们讨论一下如何建立服务器程序。这个例 子将使用 TcpList

10、ener 类,在 13 号端口监听,一旦有客户端连接,将立即向客户端发送当前服务器的时间 信息。 TcpListener 的关键在于 AcceptTcpClient()方法,该方法将检测端口是否有未处理的连接请求,如果有 未处理的连接请求,该方法将使服务器同客户端建立连接,并且返回一个 TcpClient 对象,通过这个对象的 GetStream 方 法 建 立 同 客 户 端 通 讯 的 数 据 流 。 事 实 上 , TcpListener 类 还 提 供 一 个 更 为 灵 活 的 方 法 AcceptSocket(),当然灵活的代价是复杂,对于比较简单的程序,AcceptTcpClie

11、nt()已经足够用了。此外, TcpListener 类提供 Start()方法开始监听,提供 Stop()方法停止监听。 首先我们使用端口初始化一个 TcpListener 实例,并且开始在 13 端口监听:private const int portNum = 13; TcpListener listener = new TcpListener(portNum); listener.Start();/开始监听 如果有未处理的连接请求,使用 AcceptTcpClient 方法进行处理,并且获取数据流:TcpClient client = listener.AcceptTcpClient()

12、; NetworkStream ns = client.GetStream(); 然后,获取本机时间,并保存在字节数组中,使用 NetworkStream.Write()方法写入数据流,然后客户 端就可以通过 Read()方法从数据流中获取这段信息:byte byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString();ns.Write(byteTime, 0, byteTime.Length); ns.Close();/不要忘记关闭数据流和连接 client.Close(); 服务器端程序完整的程序清单如下:using System;

13、using System.Net.Sockets; using System.Text;namespace TimeServer class TimeServer private const int portNum = 13;STAThread static void Main(string args) bool done = false; TcpListener listener = new TcpListener(portNum); listener.Start(); while (!done) Console.Write(“Waiting for connection“); TcpCli

14、ent client = listener.AcceptTcpClient();Console.WriteLine(“Connection accepted.“); NetworkStream ns = client.GetStream();byte byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString();try ns.Write(byteTime, 0, byteTime.Length); ns.Close(); client.Close(); catch (Exception e) Console.WriteLine(e.ToString(); listener.Stop(); 把上面两段程序分别编译运行,OK,我们已经用 C#实现了基于 TCP 协议的网络通讯,怎么样?很简 单吧! 使用上面介绍的基本方法,我们可以很容易的编写出一些很有用的程序,如 FTP,电子邮件收发,点 对点即时通讯等等,你甚至可以自己编制一个 QQ 来!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号