C#Socket

此博客提供了 Socket 服务器与客户端的代码示例。服务器端监听端口 9050,等待客户端连接,接收并回传客户端数据;客户端连接到指定 IP 和端口,可输入数据与服务器交互,输入 'exit' 则断开连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//The Server

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketTest
{
 public class Server3
 {
  public Server3()
  {
   
  }
  public void run() {
   string data;
   IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
   Socket newsock = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream, ProtocolType.Tcp);
   newsock.Bind(ipep);
   newsock.Listen(10);
   Console.WriteLine("Waiting for a client...");
   Socket client = newsock.Accept();
   IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
   Console.WriteLine("Connected with {0} at port {1}",
    newclient.Address, newclient.Port);
   NetworkStream ns = new NetworkStream(client);
   StreamReader sr = new StreamReader(ns);
   StreamWriter sw = new StreamWriter(ns);
   string welcome = "Welcome to my test server";
   sw.WriteLine(welcome);
   sw.Flush();
   while(true) {
    try {
     data = sr.ReadLine();
    } catch (IOException) {
     break;
    }
    Console.WriteLine(data);
    sw.WriteLine(data);
    sw.Flush();
   }
   Console.WriteLine("Disconnected from {0}", newclient.Address);
   sw.Close();
   sr.Close();
   ns.Close();
  }
 }
}

/////////////////////////////////////////////////////////////////////////

//The Client

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketTest
{

 public class Client3
 {
  public Client3()
  {
   
  }
  public void run() {
   string data;
   string input;
   IPEndPoint ipep = new IPEndPoint(
    IPAddress.Parse("127.0.0.1"), 9050);
   Socket server = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream, ProtocolType.Tcp);
   try {
    server.Connect(ipep);
   } catch (SocketException e) {
    Console.WriteLine("Unable to connect to server.");
    Console.WriteLine(e.ToString());
    return;
   }
   NetworkStream ns = new NetworkStream(server);
   StreamReader sr = new StreamReader(ns);
   StreamWriter sw = new StreamWriter(ns);
   data = sr.ReadLine();
   Console.WriteLine(data);
   while(true) {
    input = Console.ReadLine();
    if (input == "exit")
     break;
    sw.WriteLine(input);
    sw.Flush();
    data = sr.ReadLine();
    Console.WriteLine(data);
   }
   Console.WriteLine("Disconnecting from server...");
   sr.Close();
   sw.Close();
   ns.Close();
   server.Shutdown(SocketShutdown.Both);
   server.Close();
  }
 }
}

<think>好的,我现在需要帮助用户解决关于C# Socket编程的示例和常见问题。用户之前提到了C# Socket编程的实现,包括创建Socket对象、绑定、监听等步骤,并引用了相关的代码示例。现在用户想更深入了解,可能需要一个完整的示例以及常见问题的解决方法。 首先,我应该整理一个基本的C# Socket服务器和客户端的示例代码。用户之前提供的引用中有C#和C++的例子,但用户现在需要的是C#,所以需要确保示例使用C#语法。服务器端需要包括创建Socket、绑定IP和端口、监听、接受连接、接收和发送数据等步骤。客户端则需要创建Socket、连接服务器、发送和接收数据。 接下来是常见问题。用户可能遇到连接失败、数据接收不全、端口占用、异常处理等问题。需要针对每个问题给出可能的原因和解决方法。例如,连接失败可能是IP或端口错误,防火墙阻止,或者服务器未启动。数据接收不全可能是因为TCP的流特性,需要循环接收直到所有数据到达。端口占用可以通过设置ReuseAddress选项来解决。异常处理则需要使用try-catch块来捕获SocketException等异常。 另外,用户可能关心多客户端处理,这可以通过异步方法或多线程来实现。在示例中加入异步处理的代码片段会更有帮助,比如使用BeginAccept和BeginReceive。同时,资源释放也是重要的一点,需要提醒用户正确关闭Socket和流。 还需要确保回答符合系统级指令,比如使用正确的中文,数学表达式用$...$格式,但这里可能不太涉及数学内容。引用部分要正确标注,但根据用户提供的引用,可能不需要额外添加,除非有直接引用的地方。不过用户提供的引用中有C#和C++的例子,需要确保示例正确转换到C#。 最后,生成相关问题,帮助用户进一步学习,比如TCP和UDP的区别、异步通信实现、处理粘包等。这些问题应该与Socket编程紧密相关,并覆盖用户可能感兴趣的进阶话题。 现在需要检查示例代码的正确性,确保语法正确,比如使用TcpListener和TcpClient是否更简便,或者直接使用Socket类。根据用户之前的引用,他们使用了Socket类,所以示例也应保持一致。服务器端代码可能包括Socket.Bind、Socket.Listen、Socket.Accept,而客户端使用Socket.Connect。同时,数据的发送和接收使用Send和Receive方法。 在常见问题部分,需要简明扼要地列出问题、原因和解决方法,便于用户快速查阅。比如连接问题、数据接收、多客户端、端口重用、异常处理等。每个问题点要清晰,避免冗长。 最后,确保整个回答结构清晰,步骤分明,代码示例正确,常见问题覆盖全面,相关问题具有引导性。这样用户能够通过回答掌握C# Socket编程的基础和应对常见问题的方法。</think>### C# Socket编程示例及常见问题 #### 一、基础示例(同步通信) **服务器端代码**: ```csharp using System.Net; using System.Net.Sockets; using System.Text; // 创建Socket对象 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Any, 6000); try { serverSocket.Bind(serverEndPoint); serverSocket.Listen(10); Console.WriteLine("等待客户端连接..."); Socket clientSocket = serverSocket.Accept(); // 阻塞等待客户端连接 Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 已连接"); // 接收数据 byte[] buffer = new byte[1024]; int bytesRead = clientSocket.Receive(buffer); string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"接收: {receivedData}"); // 发送响应 string response = "Server response"; clientSocket.Send(Encoding.UTF8.GetBytes(response)); } finally { serverSocket.Close(); } ``` **客户端代码**: ```csharp using System.Net; using System.Net.Sockets; using System.Text; Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000); try { clientSocket.Connect(serverEndPoint); // 连接服务器 Console.WriteLine("已连接服务器"); // 发送数据 string message = "Hello Server"; clientSocket.Send(Encoding.UTF8.GetBytes(message)); // 接收响应 byte[] buffer = new byte[1024]; int bytesRead = clientSocket.Receive(buffer); string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"响应: {response}"); } finally { clientSocket.Close(); } ``` --- #### 二、常见问题及解决方案 1. **连接失败** - **原因**:IP/端口错误、防火墙阻止、服务器未启动 - **解决**:检查IP和端口配置,确认服务器已监听`netstat -ano | findstr 6000`[^1] 2. **数据接收不全** - **原因**:TCP是流式协议,数据可能分多次到达 - **解决**:循环接收直到数据完整 ```csharp int totalBytes = 0; while (totalBytes < buffer.Length) { int bytesRead = clientSocket.Receive(buffer, totalBytes, buffer.Length - totalBytes, SocketFlags.None); if (bytesRead == 0) break; // 连接关闭 totalBytes += bytesRead; } ``` 3. **多客户端处理** - **问题**:同步代码只能处理单个客户端 - **解决**:使用异步方法(`BeginAccept`/`BeginReceive`)或线程池 ```csharp void AcceptCallback(IAsyncResult ar) { Socket client = serverSocket.EndAccept(ar); ThreadPool.QueueUserWorkItem(HandleClient, client); serverSocket.BeginAccept(AcceptCallback, null); // 继续监听新连接 } ``` 4. **端口占用** - **解决**:设置`ReuseAddress`选项 ```csharp serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); ``` 5. **异常处理** - **关键异常类型**:`SocketException`(错误码见`SocketError`枚举) - **示例**: ```csharp try { clientSocket.Connect(serverEndPoint); } catch (SocketException ex) { Console.WriteLine($"连接失败,错误码: {ex.SocketErrorCode}"); } ``` --- #### 三、进阶建议 - **粘包处理**:定义固定长度包头(如4字节表示数据长度) - **异步优化**:使用`TcpListener`/`TcpClient`简化操作,或基于`async/await`实现 - **资源释放**:确保`Close()`或`Dispose()`释放Socket资源 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值