飞翔工作室

用我们辛勤的汗水,依靠网络的力量去改变生活,哪怕一点点-用心去做

« 敢问你军训过几次?

C#中的Socket

前段时间在论坛看到有位同事发表了一篇关于Socket的文章,那篇文章是关于Java的,现在我大体说一下C#中的Socket,最后简单提一下Silverlight中的连接。
一、C# Winform中的Socket
对于Socket的使用其实是比较简单的,整个流程就就如同打电话,首先要连接(拨号),连接成功(接通)之后,就可以发送(通话)数据,同时也可以接收(通话)数据,最后关闭连接(挂机)。二者的区别就是打电话双方都可以拨号,而Socket只有客户端可以拨号,服务器端需要等待客户端的连接请求,然后他们之间才会建立连接,客户端与服务器端就可以通信了。
C#部分代码(仅说明TCP连接)
1、连接
客户端:
 Socket ClientSocket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         IPAddress address = IPAddress.Parse(服务器地址);
         IPEndPoint IPEP = new IPEndPoint(address , 端口号);
         ClientSocket.BeginConnect(IPEP, ConnetCallback, null);
服务器端:
 m_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 m_serverSocket.Bind(new IPEndPoint(IPAddress.Any,端口号));
         m_serverSocket.Accept();
这段代码,在任何介绍Socket通信的都能够查到,客户端代码的主要作用就是去主动请求连接,而服务器就是等待客户端的连接,作为服务器端,为了测试方便,将监听地址设置为Any,端口号需要自己协定,然后Socket执行Accept,等待客户端的连接请求,这个地方会阻塞线程,在下面会说明如何去处理。
2、接收/发送
连接成功后,下一步就是接收发送,这个在客户端与服务器端是相同的,
m_socket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, SocketFlags.None, this.EndReceiveDatagram, this);
接收函数是异步的,函数中的参数的具体意义就不详细说明了,只是说一下this.EndReceiveDatagram是一个回调函数,数据接收完成后会去执行这个函数
m_socket.BeginSend(heart, 0, heart.Length, SocketFlags.None, this.EndSendDatagram, this);
发送函数也是异步的,在接收发送时,大家要注意他所处理的数据都是字节数组,所以需要我们去将字符串转换一下,抓换函数也是VS所提供的System.Text.Encoding,具体使用哪一种转换,客户端与服务器协商好就OK了。
3、关闭连接
客户端与服务器端双方都可以关闭连接,m_socket.Shutdown(SocketShutdown.Both),在确定不在继续通信时关闭连接,以免会引发异常。

Socket在C#中的具体使用时,大家习惯,也是较好的使用方式就是创建三个线程,一个用于服务器端的监听,一个用于数据处理,再一个用于心跳检测。
1、监听线程:前面有提到Socket监听会阻塞线程,而且服务器是1对多的关系,他监听到客户端请求后,处理完当前连接,会继续等待连接请求,所以我们需要把监听放到一个单独线程中处理。
2、数据处理线程:处理数据也是比较麻烦的,我们要解析协议,保存数据,如果有需要还需转发数据,如此多的步骤运行起来是耗时间的,直接对数据做处理,可能会影响到接收,所以我们有必要把数据处理放到一个线程中。
3、心跳检测线程:心跳检测一般只用于长连接,如果客户端与服务器端一直处于连接状态,但又有很长时间没有发送数据/接收数据,这时就有必要发送一个心跳包,确定连接是否正常,如果不正常,将其关闭。
二、Silverlight中的Socket
Silverlight中的Socket连接稍微麻烦一点,由于Silverlight属于Web应用,他增加了一个策略认证机制,他所能连接的地址仅限于4502-4505,而且连接时,客户端首先会向服务器的943端口发起策略认证,认证通过后,才会连接我们所指定的端口,不过这个客户端请求认证是Socket自己完成,无需我们人为处理,但服务器端需要我们做处理,所以大家在做Socket通信的时候要注意这一点。
我对于Socket通信也是初识,以上内容如有问题,敬请大家指点。

  • 相关文章:
  • quote 4.柠檬茶
  • http://www.wdcdn.com
  • 文章很不错,博主很用心,不过您的网站速度有些慢,可以使用WDCDN联盟提供的免费CDN加速服务,还支持免备案加速哦。
  • 2012-5-9 11:04:35 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

鲁ICP备09002909号 Copyright my0530.com. Some Rights Reserved.
QQ:272211468 E-mail:hzsuchuang@gmail.com