异步socket通信
by john mctainsh from: http://www.codeproject.com/csharp/socketsincs.asptranslate by: hillfree 【程序编程相关:用C#和VB.NET实现VS.NET或O】 【推荐阅读:用C#和VB.NET实现VS.NET或O】 【扩展信息:C#,程序员的新工具】 本文介绍如何使用非阻塞方式的socket通信,并且创建了一个聊天程序的例子来帮助说明. 介绍本文介绍如何在多个应用程序之间创建与使用tcp/ip socket来进行通信.这些应用程序可以运行在同一台机器,也可以在局域网内,甚至也可以是跨越internet的*.这种方法的好处是不需要你自己来使用线程,而是通过调用socket的非阻塞模式来实现.在例子中:服务器创建病侦听客户端的连接,一旦有客户连接,服务器就将其加入到一个活动客户的列表中,某个客户端发送的消息也有服务器发送到各个连接的客户端,就好像聊天室中的那样.或许remoting (远程调用)是做这种工作更好的办法,但是我们这里还是来学习学习如何使用socket来实现.
*注意:跨越internet的通讯要求服务器有独立的ip地址并且不在代理或是放火墙之后.
事件时序服务器必须要先侦听,客户端才能够连接.下面的图例说明了在一个异步socket会话中的事件时序.
运行示例实例代码分为两部分:chatserver 与chatclient. 我们首先来创建chatserver ,然后使用下面的telnet命令来测试它.
telnet {server machine ip address or machine name} 399telnet 10.328.32.76 399这时,服务器上应该出现一条消息来表明这个客户连接的地址与端口.在任一个telnet窗口中键入的字符都会回显到所有与服务器连接的telnet的窗口中.试试从多台机器上并发连接服务器.不要使用localhost或者127.0.0.1来作为服务器程序唯一的侦听地址.
然后运行chatclient实例作相同的试验与多个客户端与多个telnet并存的测试.
为什么要使用.net的socket?.net在很多地方都用到了sockets,比如:webservices与remoting.但是在那些应用中底层的socket支持已经做好了,不需要直接使用.但是,与其他非.net系统的socket打交道或简单通信的场合中socket的使用还是很有必要的.它可以用来与诸如dos,windows与unix系统进行通信.底层的socket应用也可以让你减少了诸如组测,权限,域(domains),用户id,密码等这些麻烦的安全方面的顾虑.
chatserver / listener服务器侦听端口,当有连接请求时,接受该连接并返回一条欢迎信息.在例子中客户连接被加到一个活动客户列表m_aryclients中去.这个列表会根据客户加入与离开作相应的增删.在某些情况下可能会丢失连接,所以在实际的系统中还应该有轮询侦测客户端是否在线的部分.当服务器端的listener收到客户端发来的信息后,它会把消息广播到所有连接的客户端.
下面讨论两种侦听的方法,一个是用轮询(polling),另外一个在使用事件来侦测连接的请求.
方法1 – 使用轮询的 tcplistenersystem.net.sockets中的tcplistener 类为我们提供了一个侦听与处理客户连接的简单手段.下面的代码侦听连接,接受连接,并且向客户连接发回一个带有时间戳的欢迎信息.如果有另外一个连接请求到来,原来的连接将会丢失.注意,欢迎信息是采用ascii编码,而不是unicode.
... 下一页