服务端使用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(); }
TCP 通信
最新推荐文章于 2024-09-15 22:36:10 发布