在C#中,Socket通信是一种用于实现网络通信的底层技术。通过Socket,程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets
命名空间来实现Socket通信的详细步骤。
1. Socket通信的基本概念
- Socket: 一个Socket是网络通信的端点,它封装了IP地址和端口号。
- Server(服务器端): 监听客户端的连接请求,并处理数据。
- Client(客户端): 主动发起与服务器的连接,并发送或接收数据。
- 协议: 常用的协议有TCP(面向连接、可靠传输)和UDP(无连接、不可靠但高效)。
2. 使用TCP协议的Socket通信
(1) 服务器端代码
服务器端需要监听指定的IP地址和端口,等待客户端的连接请求。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class TcpServer
{static void Main(string[] args){// 定义IP地址和端口号IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 本地回环地址int port = 8888;// 创建Socket对象Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);try{// 绑定IP地址和端口listener.Bind(new IPEndPoint(ipAddress, port));listener.Listen(10); // 设置最大连接数为10Console.WriteLine("服务器已启动,等待客户端连接...");// 接受客户端连接Socket handler = listener.Accept();Console.WriteLine("客户端已连接!");// 接收数据byte[] buffer = new byte[1024];int bytesReceived = handler.Receive(buffer);string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"接收到的数据: {receivedData}");// 发送响应数据string response = "Hello from server!";byte[] responseData = Encoding.UTF8.GetBytes(response);handler.Send(responseData);// 关闭连接handler.Shutdown(SocketShutdown.Both);handler.Close();}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{listener.Close();}}
}
(2) 客户端代码
客户端需要主动连接到服务器,并发送或接收数据。
using System;
using System.Net.Sockets;
using System.Text;class TcpClientExample
{static void Main(string[] args){// 定义服务器的IP地址和端口号string serverIp = "127.0.0.1";int port = 8888;// 创建Socket对象Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 连接到服务器client.Connect(serverIp, port);Console.WriteLine("已连接到服务器!");// 发送数据string message = "Hello from client!";byte[] data = Encoding.UTF8.GetBytes(message);client.Send(data);// 接收服务器响应byte[] buffer = new byte[1024];int bytesReceived = client.Receive(buffer);string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"服务器响应: {response}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{client.Close();}}
}
3. 使用UDP协议的Socket通信
(1) 服务器端代码
UDP是无连接的协议,服务器不需要显式接受连接。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpServer
{static void Main(string[] args){// 定义IP地址和端口号IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 9999;// 创建Socket对象UdpClient udpServer = new UdpClient(port);Console.WriteLine("UDP服务器已启动,等待数据...");// 接收数据IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] receivedData = udpServer.Receive(ref remoteEndPoint);string message = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"接收到的数据: {message} 来自 {remoteEndPoint}");// 发送响应数据string response = "Hello from UDP server!";byte[] responseData = Encoding.UTF8.GetBytes(response);udpServer.Send(responseData, responseData.Length, remoteEndPoint);// 关闭SocketudpServer.Close();}
}
(2) 客户端代码
客户端直接向服务器发送数据,无需建立连接。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpClientExample
{static void Main(string[] args){// 定义服务器的IP地址和端口号string serverIp = "127.0.0.1";int port = 9999;// 创建Socket对象UdpClient udpClient = new UdpClient();try{// 发送数据IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), port);string message = "Hello from UDP client!";byte[] data = Encoding.UTF8.GetBytes(message);udpClient.Send(data, data.Length, serverEndPoint);// 接收服务器响应byte[] receivedData = udpClient.Receive(ref serverEndPoint);string response = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"服务器响应: {response}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{udpClient.Close();}}
}
4. 注意事项
- 异常处理: 在实际开发中,必须对网络异常(如超时、连接中断等)进行处理。
- 多线程支持: 如果需要同时处理多个客户端连接,可以使用多线程或异步编程。
- 防火墙和端口: 确保服务器的端口未被防火墙阻止。
- 编码格式: 数据传输时需注意编码格式的一致性(如UTF-8)。
以上是C#中Socket通信的基本实现方法。根据实际需求,可以选择TCP或UDP协议,并结合异步编程(如async/await
)提高性能和可扩展性。
C# async/await的使用_c# async await用法-CSDN博客文章浏览阅读1.3k次,点赞5次,收藏8次。本文详细介绍了C#中async和await关键字在实现异步编程中的作用,包括如何定义异步方法、await用于等待异步操作完成的特点,以及注意事项,如避免阻塞操作和正确嵌套。这些技术有助于提升程序性能和响应性。https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331