c# socket网络编程接收发送数据示例代码
- 行业动态
- 2025-02-25
- 2
在C#中,使用Socket类进行网络编程可以接收和发送数据。以下是一个简单的示例代码:“
csharp,using System;,using System.Net;,using System.Net.Sockets;,using System.Text;class Program,{, static void Main(), {, // 创建Socket对象, Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 连接到服务器, client.Connect(IPAddress.Parse("127.0.0.1"), 8080); // 发送数据, string message = "Hello, Server!";, byte[] data = Encoding.ASCII.GetBytes(message);, client.Send(data); // 接收数据, byte[] buffer = new byte[1024];, int received = client.Receive(buffer);, string response = Encoding.ASCII.GetString(buffer, 0, received);, Console.WriteLine("Received: " + response); // 关闭连接, client.Shutdown(SocketShutdown.Both);, client.Close();, },},
“
服务器端代码
using System; using System.Net; using System.Net.Sockets; using System.Text; class ServerProgram { static void Main() { // 创建IPEndPoint对象,指定服务器的IP地址和端口号 IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 5000); // 创建Socket对象 Socket listener = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { // 将Socket绑定到指定的IPEndPoint listener.Bind(localEndPoint); // 开始监听传入的连接请求 listener.Listen(10); Console.WriteLine("等待客户端连接..."); while (true) { // 接受客户端的连接请求 Socket handler = listener.Accept(); string clientAddress = handler.RemoteEndPoint.ToString(); Console.WriteLine("客户端 {0} 已连接", clientAddress); // 创建一个线程来处理客户端的请求 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(handler); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } public static void HandleClientComm(object obj) { Socket handler = (Socket)obj; byte[] buffer = new byte[1024]; int bytesRead; // 接收客户端发送的数据 while ((bytesRead = handler.Receive(buffer)) != 0) { string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("收到来自客户端的数据: {0}", dataReceived); // 将接收到的数据转换回字节数组并发送给客户端 byte[] msg = Encoding.ASCII.GetBytes(dataReceived); handler.Send(msg, 0, msg.Length); } // 关闭与客户端的连接 handler.Shutdown(SocketShutdown.Both); handler.Close(); } }
客户端代码
using System; using System.Net; using System.Net.Sockets; using System.Text; class ClientProgram { static void Main() { // 创建DnsEndPoint对象,指定服务器的主机名和端口号 DnsEndPoint remoteEndPoint = new DnsEndPoint("localhost", 5000); // 创建Socket对象 Socket sender = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { // 连接到服务器 sender.Connect(remoteEndPoint); Console.WriteLine("已连接到服务器"); Console.WriteLine("请输入要发送的消息:"); string message = Console.ReadLine(); byte[] msg = Encoding.ASCII.GetBytes(message); // 向服务器发送数据 int bytesSent = sender.Send(msg, 0, msg.Length); Console.WriteLine("发送了 {0} 字节", bytesSent); // 接收服务器返回的数据 byte[] buffer = new byte[1024]; int bytesRec = sender.Receive(buffer, 0, buffer.Length, SocketFlags.None); string receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRec); Console.WriteLine("从服务器收到消息: {0}", receivedMessage); // 关闭与服务器的连接 sender.Shutdown(SocketShutdown.Both); sender.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } }
在这个示例中,服务器端程序首先创建一个Socket
对象,并将其绑定到指定的IP地址和端口号上,然后开始监听传入的连接请求,当有客户端连接到服务器时,服务器会为每个客户端创建一个新线程来处理其请求,在处理客户端请求的线程中,服务器接收客户端发送的数据,并将相同的数据返回给客户端,客户端程序则创建一个Socket
对象,连接到服务器,然后向服务器发送一条消息,并接收服务器返回的消息,客户端关闭与服务器的连接。
需要注意的是,在实际的网络编程中,还需要考虑更多的异常处理和错误检查,以确保程序的稳定性和可靠性,还可以根据具体的需求对代码进行扩展和优化,例如添加多线程支持、使用异步编程模型等。
相关问答FAQs
问题1:如何确保服务器能够同时处理多个客户端的连接请求?
答:在这个示例中,服务器为每个连接的客户端创建了一个新的线程来处理其请求,这样,每个客户端都有自己独立的线程,可以同时处理多个客户端的连接请求,在实际应用中,如果客户端数量非常多,可能会因为线程过多而导致系统资源耗尽,可以考虑使用线程池或者异步编程模型来更有效地管理线程资源。
问题2:如何处理网络通信中的异常情况?
答:在网络通信中,可能会出现各种异常情况,例如网络中断、数据传输错误等,为了处理这些异常情况,可以在代码中添加适当的异常处理逻辑,可以使用try-catch块来捕获异常,并在捕获到异常时进行相应的处理,如记录日志、通知用户等,还可以在发送和接收数据时设置超时时间,以避免程序在某些情况下无限期地等待。