好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Socket的TCP通讯连接

Socket的TCP通讯连接

Socket

 

[C#]手把手教你打造Socket的TCP通讯连接(四)

摘要: 上一篇中,我们已经学会了服务器的代码,至此我们的SOcket的TCP通讯连接已经完成。这一篇我们总结一下。服务器开启后,开始异步监听客户端连接。客户端连接时,实例化TCPListenerClient,并开始异步监听数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。可以通过TCPListenerClient发送数据或断开连接。服务器关闭时要先断开所有客户端连接。客户端连接服务器,开始异步接收服务器数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。客户端连接服务器后,可以发送数据与断开连接。SocketHandler是专门处理接收发送的对 阅读全文

posted @  2013-03-10 13:13  Kation 阅读(356) |  评论 (2)   编辑

[C#]手把手教你打造Socket的TCP通讯连接(三)

摘要: 上一篇中,我们编写了SocketHandler处理Socket的IO。现在我们只剩下服务器端了。服务器端包含两个类,一个TCPListener,一个TCPListenerClient。TCPListener只管Start与Stop还有Accept。TCPListenerClient是连接到服务器的客户端,相当于TCPClient在TCPListener上的体现。现在我们开始编写TCPListener。/// <summary>/// TCP监听端/// </summary>public class TCPListener : IEnumerable<TCPList 阅读全文

posted @  2013-03-07 01:51  Kation 阅读(260) |  评论 (0)   编辑

[C#]手把手教你打造Socket的TCP通讯连接(二)

摘要: 上一篇中,我们编写了客户端功能。这一篇将讲解ISocketHandler的实现。再来回顾一下ISocketHandler接口。public interface ISocketHandler{ /// <summary> /// 开始接收 /// </summary> /// <param name="stream">Socket网络流</param> /// <param name="callback">回调函数</param> /// <param name="st 阅读全文

posted @  2013-03-06 22:49  Kation 阅读(193) |  评论 (0)   编辑

[C#]手把手教你打造Socket的TCP通讯连接(一)

摘要: 本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用。在编写Socket代码之前,我们得要定义一下Socket的基本功能。作为一个TCP连接,不论是客户端还是服务器端,它都得有以下接口:public interface ISocket{ /// <summary> /// 获取是否已连接。 /// </summary> bool IsConnected { get; } /// <summary> /// 发送数据。 /// </summary> /// <param name=" 阅读全文

posted @  2013-03-06 21:07  Kation 阅读(362) |  评论 (5)   编辑

上一篇 中,我们已经学会了服务器的代码,至此我们的SOcket的TCP通讯连接已经完成。这一篇我们总结一下。

服务器开启后,开始异步监听客户端连接。客户端连接时,实例化TCPListenerClient,并开始异步监听数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。

可以通过TCPListenerClient发送数据或断开连接。

服务器关闭时要先断开所有客户端连接。

客户端连接服务器,开始异步接收服务器数据。接收到数据时,判断数据长度,0则为断开连接,不为0则引发接收数据完成事件。

客户端连接服务器后,可以发送数据与断开连接。

SocketHandler是专门处理接收发送的对象。

发送数据时,要判断发送队列是否有数据正在发送或等待发送。如果有数据,则把要发送的数据加入发送队列。

发送数据过程,先发送要发送数据的长度=>ushor类型=>byte[]类型。然后再发送主数据。

发送完成时,判断发送队列是否还有数据,有则继续发送。返回是否发送成功。遇到异常则不成功。

接收数据时,先接收byte[2]的主要数据长度头信息,转换为ushort类型。

然后接收这个长度的数据,EndRead里要判断是否接收完全,不完全则继续接收。

接收完成后直接返回接收到的数据。

下面发一个简易测试延迟程序的示例代码。

客户端。

View Code

 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);
        }
    }
} 

服务器。

View Code

 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

 

 

分类:  Socket

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Socket的TCP通讯连接的详细内容...

  阅读:36次