同步TCP应用编程---“吃棋子”游戏
1. TcpClient类
TcpClient类归类在System.Net命名空间下。利用TcpClient类提供的方法,可以通过网络进行连接、发送和接收网络数据流。该类的构造函数有四种重载形式:
1) TcpClient()
该构造函数创建一个默认的TcpClient对象,该对象自动选择客户端尚未使用的IP地址和端口号。创建该对象后,即可用Connect方法与服务器端进行连接。例如:
TcpClient tcpClient=new TcpClient();
tcpClient.Connect("www.abcd.com", 51888);
2) TcpClient(AddressFamily family)
该构造函数创建的TcpClient对象也能自动选择客户端尚未使用的IP地址和端口号,但是使用AddressFamily枚举指定了使用哪种网络协议。创建该对象后,即可用Connect方法与服务器端进行连接。例如:
TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);
tcpClient.Connect("www.abcd.com", 51888);
3) TcpClient(IPEndPoint iep)
iep是IPEndPoint类型的对象,iep指定了客户端的IP地址与端口号。当客户端的主机有一个以上的IP地址时,可使用此构造函数选择要使用的客户端主机IP地址。例如:
IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName());
IPEndPoint iep = new IPEndPoint(address[0], 51888);
TcpClient tcpClient = new TcpClient(iep);
tcpClient.Connect("www.abcd.com", 51888);
4) TcpClient(string hostname,int port)
这是使用最方便的一种构造函数。该构造函数可直接指定服务器端域名和端口号,而且不需使用connect方法。客户端主机的IP地址和端口号则自动选择。例如:
TcpClient tcpClient=new TcpClient("www.abcd.com", 51888);
表2-1和表2-2分别列出了TcpClient类的常用属性和方法。
表2-1 TcpClient类的常用属性
属性 |
含义 |
Client |
获取或设置基础套接字 |
LingerState |
获取或设置套接字保持连接的时间 |
NoDelay |
获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟 |
ReceiveBufferSize |
获取或设置Tcp接收缓冲区的大小 |
ReceiveTimeout |
获取或设置套接字接收数据的超时时间 |
SendBufferSize |
获取或设置Tcp发送缓冲区的大小 |
SendTimeout |
获取或设置套接字发送数据的超时时间 |
表2-2 TcpClient类的常用方法
方法 |
含义 |
Close |
释放TcpClient实例,而不关闭基础连接 |
Connect |
用指定的主机名和端口号将客户端连接到TCP主机 |
BeginConnect |
开始一个对远程主机连接的异步请求 |
EndConnect |
异步接受传入的连接尝试 |
GetStream |
获取能够发送和接收数据的NetworkStream对象 |
2. TcpListener类
TcpListener类用于监听和接收传入的连接请求。该类的构造函数有:
1) TcpListener(IPEndPoint iep)
其中iep是IPEndPoint类型的对象,iep包含了服务器端的IP地址与端口号。该构造函数通过IPEndPoint类型的对象在指定的IP地址与端口监听客户端连接请求。
2) TcpListener(IPAddress localAddr, int port)
建立一个TcpListener对象,在参数中直接指定本机IP地址和端口,并通过指定的本机IP地址和端口号监听传入的连接请求。
构造了TcpListener对象后,就可以监听客户端的连接请求了。与TcpClient相似,TcpListener也分别提供了同步和异步方法,在同步工作方式下,对应有AcceptTcpClient方法、AcceptSocket方法、Start方法和Stop方法。
AcceptSocket方法用于在同步阻塞方式下获取并返回一个用来接收和发送数据的套接字对象。该套接字包含了本地和远程主机的IP地址与端口号,然后通过调用Socket对象的Send和Receive方法和远程主机进行通信。
AcceptTcpClient方法用于在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了Socket的TcpClient对象。
Start方法用于启动监听,构造函数为:
public void Start(int backlog)
整型参数backlog为请求队列的最大长度,即最多允许的客户端连接个数。Start方法被调用后,把自己的LocalEndPoint和底层Socket对象绑定起来,并自动调用Socket对象的Listen方法开始监听来自客户端的请求。如果接受了一个客户端请求,Start方法会自动把该请求插入请求队列,然后继续监听下一个请求,直到调用Stop方法停止监听。当TcpListener接受的请求超过请求队列的最大长度或小于0时,等待接受连接请求的远程主机将会抛出异常。
Stop方法用于停止监听请求,构造函数为:
public void Stop()
程序执行Stop方法后,会立即停止监听客户端连接请求,并关闭底层的Socket对象。等待队列中的请求将会丢失,等待接受连接请求的远程主机会抛出套接字异常。
今天试着用winform根据《网络高级编程》中的例子 同步TCP,其中里面有很多可以借鉴的东西,包括相关代码注释以及使用面向对象的思维来考虑问题,当然里面的代码也有一些需要优化的,在今后的代码中要适当的进行改正
这个例子主要采用的是换行符作为TCP无消息边界的处理,相对来说是比较简单的,只要理解了相关的原理,相信大家都可以写出来,对于流的处理,以后会写一个文件传输的例子来处理消息边界,当然对于相关的代理技术以及HTTP隧道相关方面的东西我还不是很了解,以后要逐步加深
吃棋子”/Files/fujinliang/GameServer.rar游戏