跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 套接字编程
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#套接字编程 = '''套接字编程'''(Socket Programming)是网络通信的核心技术之一,它允许不同主机上的进程通过TCP/IP协议进行数据交换。在C#中,套接字编程主要通过<code>System.Net.Sockets</code>命名空间下的类实现,尤其是<code>Socket</code>类。本指南将详细介绍C#套接字编程的基础概念、实现方法及实际应用。 == 概述 == 套接字(Socket)是网络通信的端点,它定义了通信的两端(客户端和服务器)如何建立连接、发送和接收数据。在C#中,套接字编程支持以下主要协议: * '''TCP(传输控制协议)''':面向连接、可靠的字节流通信。 * '''UDP(用户数据报协议)''':无连接、不可靠但高效的数据报通信。 === 套接字通信流程 === <mermaid> graph TD A[创建Socket对象] --> B[绑定IP和端口(服务器)] B --> C[监听连接(服务器)] C --> D[接受连接(服务器)] A --> E[连接服务器(客户端)] D --> F[发送/接收数据] E --> F F --> G[关闭连接] </mermaid> == TCP套接字编程 == TCP套接字编程分为'''服务器端'''和'''客户端'''两部分。 === 服务器端实现 === 以下是一个简单的TCP服务器示例,监听本地端口8080并接收客户端消息: <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpServer { static void Main() { // 1. 创建Socket对象 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2. 绑定IP和端口 IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8080); serverSocket.Bind(endPoint); // 3. 开始监听,最大连接数为10 serverSocket.Listen(10); Console.WriteLine("服务器已启动,等待连接..."); // 4. 接受客户端连接 Socket clientSocket = serverSocket.Accept(); Console.WriteLine($"客户端已连接: {clientSocket.RemoteEndPoint}"); // 5. 接收数据 byte[] buffer = new byte[1024]; int bytesRead = clientSocket.Receive(buffer); string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到消息: {receivedMessage}"); // 6. 发送响应 string response = "消息已接收"; clientSocket.Send(Encoding.UTF8.GetBytes(response)); // 7. 关闭连接 clientSocket.Close(); serverSocket.Close(); } } </syntaxhighlight> === 客户端实现 === 对应的TCP客户端代码: <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpClient { static void Main() { // 1. 创建Socket对象 Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2. 连接服务器 IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080); clientSocket.Connect(serverEndPoint); // 3. 发送数据 string message = "Hello, Server!"; clientSocket.Send(Encoding.UTF8.GetBytes(message)); // 4. 接收响应 byte[] buffer = new byte[1024]; int bytesRead = clientSocket.Receive(buffer); string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"服务器响应: {response}"); // 5. 关闭连接 clientSocket.Close(); } } </syntaxhighlight> === 输入输出示例 === 运行服务器和客户端后,输出如下: <pre> 服务器输出: 服务器已启动,等待连接... 客户端已连接: 127.0.0.1:12345 收到消息: Hello, Server! 客户端输出: 服务器响应: 消息已接收 </pre> == UDP套接字编程 == UDP是无连接的协议,适用于对实时性要求高但允许少量丢包的场景(如视频流)。 === 服务器端实现 === <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpServer { static void Main() { // 1. 创建UDP Socket Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // 2. 绑定端口 udpSocket.Bind(new IPEndPoint(IPAddress.Any, 9090)); Console.WriteLine("UDP服务器已启动"); // 3. 接收数据(无需连接) byte[] buffer = new byte[1024]; EndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 0); int bytesRead = udpSocket.ReceiveFrom(buffer, ref clientEndPoint); string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到来自 {clientEndPoint} 的消息: {message}"); // 4. 发送响应 udpSocket.SendTo(Encoding.UTF8.GetBytes("UDP响应"), clientEndPoint); udpSocket.Close(); } } </syntaxhighlight> === 客户端实现 === <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpClient { static void Main() { // 1. 创建UDP Socket Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // 2. 发送数据(无需连接) IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090); udpSocket.SendTo(Encoding.UTF8.GetBytes("Hello, UDP Server!"), serverEndPoint); // 3. 接收响应 byte[] buffer = new byte[1024]; EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); int bytesRead = udpSocket.ReceiveFrom(buffer, ref remoteEndPoint); Console.WriteLine($"收到响应: {Encoding.UTF8.GetString(buffer, 0, bytesRead)}"); udpSocket.Close(); } } </syntaxhighlight> == 实际应用案例 == === 聊天应用程序 === 套接字编程常用于实现实时聊天应用。以下是简化版聊天服务器的核心逻辑: * 服务器使用<code>Accept</code>接收多个客户端连接。 * 每个客户端连接使用单独的线程处理。 * 使用<code>Send</code>/<code>Receive</code>实现消息广播。 === 网络游戏通信 === 在多人游戏中,UDP常用于传输玩家位置数据: * 低延迟比可靠性更重要。 * 客户端定期发送位置更新包到服务器。 * 服务器将其他玩家的位置广播给所有客户端。 == 高级主题 == === 异步套接字编程 === 使用<code>BeginAccept</code>/<code>EndAccept</code>等异步方法避免阻塞线程: <syntaxhighlight lang="csharp"> Socket.BeginAccept(ar => { Socket client = serverSocket.EndAccept(ar); // 处理客户端 }, null); </syntaxhighlight> === 协议设计 === 实际应用中需设计应用层协议,例如: * 消息格式:长度前缀 + 二进制数据 * 错误处理:心跳包检测连接状态 == 常见问题 == * '''端口冲突''':确保端口未被其他程序占用。 * '''防火墙限制''':测试时可能需要关闭防火墙或添加规则。 * '''编码问题''':统一使用UTF-8编码避免乱码。 == 总结 == C#套接字编程是构建网络应用的基础技能。通过<code>System.Net.Sockets</code>命名空间,开发者可以灵活实现TCP/UDP通信。实际开发中需注意: * TCP适合可靠数据传输(如文件传输)。 * UDP适合实时应用(如视频会议)。 * 异步编程模型可提升服务器性能。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 网络编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)