[C#]手把手教你打造Socket的TCP通讯连接(四)
来源:互联网 发布:毕博网络教学平台 编辑:程序博客网 时间:2024/05/17 01:16
上一篇中,我们已经学会了服务器的代码,至此我们的SOcket的TCP通讯连接已经完成。这一篇我们总结一下。
服务器开启后,开始异步监听客户端连接。客户端连接时,实例化TCPListenerClient,并开始异步监听数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。
可以通过TCPListenerClient发送数据或断开连接。
服务器关闭时要先断开所有客户端连接。
客户端连接服务器,开始异步接收服务器数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。
客户端连接服务器后,可以发送数据与断开连接。
SocketHandler是专门处理接收发送的对象。
发送数据时,要判断发送队列是否有数据正在发送或等待发送。如果有数据,则把要发送的数据加入发送队列。
发送数据过程,先发送要发送数据的长度=>ushor类型=>byte[]类型。然后再发送主数据。
发送完成时,判断发送队列是否还有数据,有则继续发送。返回是否发送成功。遇到异常则不成功。
接收数据时,先接收byte[2]的主要数据长度头信息,转换为ushort类型。
然后接收这个长度的数据,EndRead里要判断是否接收完全,不完全则继续接收。
接收完成后直接返回接收到的数据。
下面发一个简易测试延迟程序的示例代码。
客户端。
namespace PingTesterClient{ class Program { static TCPClient client; static void Main(string[] args) { client = new TCPClient(); client.ReceiveCompleted += Receive; Console.WriteLine("请输入IP地址:"); client.Connect(new System.Net.IPEndPoint(IPAddress.Parse(Console.ReadLine()), 5000)); byte[] data = BitConverter.GetBytes(DateTime.Now.TimeOfDay.TotalMilliseconds); client.SendAsync(data); Console.ReadLine(); } private static void Receive(object sender, SocketEventArgs e) { Console.WriteLine(DateTime.Now.TimeOfDay.TotalMilliseconds - BitConverter.ToDouble(e.Data, 0)); System.Threading.Thread.Sleep(100); byte[] data = BitConverter.GetBytes(DateTime.Now.TimeOfDay.TotalMilliseconds); client.SendAsync(data); } }}
服务器。
namespace PingTesterServer{ class Program { static void Main(string[] args) { var listener = new TCPListener(); listener.Port = 5000; listener.ReceiveCompleted += listener_ReceiveCompleted; listener.Start(); Console.ReadLine(); } static void listener_ReceiveCompleted(object sender, SocketEventArgs e) { e.Socket.SendAsync(e.Data); } }}
客户端发送当前时间转byte[]数据
服务器接收到后又发送客户端发送的数据。
客户端收到数据后,用当前时间减去收到的时间,除以2,得到网络延迟。
原文地址:http://www.cnblogs.com/Kation/archive/2013/03/10/2952263.html
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- [C#]手把手教你打造Socket的TCP通讯连接(四)
- [C#]手把手教你打造Socket的TCP通讯连接(三)
- [C#]手把手教你打造Socket的TCP通讯连接(二)
- [C#]手把手教你打造Socket的TCP通讯连接(一)
- [C#]手把手教你打造Socket的TCP通讯连接(二)
- [C#]手把手教你打造Socket的TCP通讯连接(一)
- [C#]手把手教你打造Socket的TCP通讯连接(一)
- [C#]手把手教你打造Socket的TCP通讯连接(三)
- 【C#】 Socket的TCP通讯
- 手把手教你打造一个Material Design风格的App(四)
- Socket的TCP通讯
- 手把手教你Photoshop蒙版的使用(四)
- C #应用SOCKET实现TCP/IP协议的通讯
- 【汇编】手把手教你打造自己的第一个操作系统
- 手把手教你打造性感无比的PPT封面
- Android:手把手教你打造可缩放移动的ImageView
- android 手把手教你打造属于自己的文件浏览器
- C# Socket的TCP通讯
- 生成Avatar
- HTTP协议--请求与响应
- android2.2中使用mina注意的问题
- Ubuntu终端的打开
- xcode 4 Git版本管理系统详解
- [C#]手把手教你打造Socket的TCP通讯连接(四)
- 循环判断是否是素数
- 将线程入口函数写在面向对象中的一个很有意思的例子
- 【BACnet】4.bacnet-stack-0.8.0工程与BACnet标准协议之间的代码关系(网络层)
- 错误: 聚合‘QDateTime time’类型不完全,无法被定义
- Ubuntu apt-cache命令查找可用软件包
- 例题
- Kinect for Windows Samples
- vmware tools怎么安装