服务端使用System.Net.Sockets.TcpListener进行监听,客户端使用System.Net.Sockets.TcpClient进行连接。一旦连接建立,两者使用System.Net.Sockets.NetworkStream进行通信。
TCP 允许两台电脑通过网络进行通信,是一种可靠的、面向连接的协议,它提供了内置的流控制、序列、错误处理。要创建一个TCP连接,必须有一台电脑充当服务器,并且监听一个具体的终结点(终结点是一个IP地址与端口号的组合)。另一台电脑充当客户端,发送连接请求到服务器正在监听的终结点。一旦建立了连接,两台电脑轮流交换信息。.NET通过抽象的流(Stream)使得这个过程变得简单了,两台电脑通过对System.Net.Sockets.NetworkStream的读、写操作来发送数据。
在设计网络应用程序时,定义服务端和客户端用于通信的协议,是一个比较不错的想法。协议包括了一些所允许命令的常量,确保了应用程序代码中不会包含硬编码的通信字符串。这些常量编译为单独的类库程序集,必须被服务端和客户端引用。
- public class SocketProtocol
- {
- public const string AcknowledgeOK = "确定连接";
- public const string AcknowledgeCancel = "取消连接";
- public const string Disconnect = "断开连接";
- public const string RequestConnect = "请求连接";
- }
TCP 服务端的代码:
- static void Main(string[] args)
- {
- //创建监听器
- TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
- Console.WriteLine("即将初始化端口");
- listener.Start();
- Console.WriteLine("监听连接");
- try
- {
- //等待连接请求并返回TcpClient
- using (TcpClient client = listener.AcceptTcpClient())
- {
- Console.WriteLine("接受连接");
- //获取网络流
- NetworkStream stream = client.GetStream();
- //创建BinaryWriter写入流
- using (BinaryWriter w = new BinaryWriter(stream))
- {
- //创建BinaryReader读取流
- using (BinaryReader r = new BinaryReader(stream))
- {
- if (r.ReadString() == SocketProtocol.RequestConnect)
- {
- w.Write(SocketProtocol.AcknowledgeOK);
- Console.WriteLine("连接完成");
- while (r.ReadString() != SocketProtocol.Disconnect)
- {
- }
- Console.WriteLine(Environment.NewLine);
- Console.WriteLine("收到断开连接请求");
- }
- else
- {
- Console.WriteLine("不能完成连接");
- }
- }
- }
- }
- Console.WriteLine("连接关闭");
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- //关闭底层的Socket(停止监听新的请求)
- listener.Stop();
- Console.WriteLine("监听器停止");
- }
- Console.WriteLine(Environment.NewLine);
- Console.ReadLine();
- }
TCP客户端的代码:
- static void Main(string[] args)
- {
- TcpClient client = new TcpClient();
- try
- {
- Console.WriteLine("尝试连接服务器");
- client.Connect(IPAddress.Parse("127.0.0.1"), 8000);
- Console.WriteLine("已建立连接");
- NetworkStream stream = client.GetStream();
- using (BinaryWriter w = new BinaryWriter(stream))
- {
- using (BinaryReader r = new BinaryReader(stream))
- {
- //开始对话
- w.Write(SocketProtocol.RequestConnect);
- if (r.ReadString() == SocketProtocol.AcknowledgeOK)
- {
- Console.WriteLine("已连接");
- Console.WriteLine("按下Enter键断开连接");
- Console.ReadLine();
- Console.WriteLine("连接断开...");
- w.Write(SocketProtocol.Disconnect);
- }
- else
- {
- Console.WriteLine("连接未完成");
- }
- }
- }
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- //关闭连接Socket
- client.Close();
- Console.WriteLine("端口已关闭");
- }
- Console.WriteLine(Environment.NewLine);
- Console.ReadLine();
- }
本文链接地址为:http://blog.youkuaiyun.com/fan_ken/article/details/6630046