C# 实现 Socket 服务器及多客户端连接的方式
在C#中,可以使用 Socket 类来实现网络编程。在这篇文章中,我将详细讲解如何使用C#实现Socket服务器及多客户端连接的方式。
什么是Socket?
Socket是一种用于在两个应用程序之间进行通信的技术。它使用IP地址和端口号来定义一个连接,并通过TCP或UDP来传输数据。
实现Socket服务器
要实现Socket服务器,您需要使用Socket类。下面是一个简单的示例,演示如何使用Socket类来创建一个简单的Socket服务器。
using System;
using System.Net;
using System.Net.Sockets;
class Program
{
static void Main(string[] args)
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 1234);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(endPoint);
listener.Listen(10);
Console.WriteLine("服务器已启动,等待客户端连接...");
while (true)
{
Socket handler = listener.Accept();
Console.WriteLine($"客户端 {handler.RemoteEndPoint} 已连接。");
byte[] bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
Console.WriteLine($"接收到来自客户端 {handler.RemoteEndPoint} 的消息:{Encoding.ASCII.GetString(bytes, 0, bytesRec)}");
string response = "服务器收到了您的消息。\n";
byte[] msg = Encoding.ASCII.GetBytes(response);
handler.Send(msg);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
}
在上面的示例中,我们首先创建一个IP地址为任意地址,端口号为1234的IPEndPoint。接下来,我们创建一个Socket对象,指定地址族为InterNetwork,协议类型为Tcp,套接字类型为Stream。我们将这个Socket对象绑定到IPEndPoint上,并开始侦听新的连接。在没有新的连接时,程序便会一直等待(阻塞状态)。
当有新的客户端连接时,我们创建了一个新的Socket对象来处理该客户端的请求。我们接收来自客户端的消息,并发送一个响应消息。在完成响应后,我们关闭这个Socket对象并继续等待新的连接。
实现多客户端连接
上面的示例中,我们只能与一个客户端连接。要实现多客户端连接,您需要使用MultiThread。
在多线程模式下,每个客户端连接都使用一个新线程来处理。如下是实现多客户端连接的示例代码:
class Program
{
static void Main(string[] args)
{
try
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
Console.WriteLine("服务器已启动,等待客户端连接...");
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(100);
while (true)
{
Socket clientSocket = listener.Accept();
Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 已连接。");
Thread newThread = new Thread(new ParameterizedThreadStart(HandleClient));
newThread.Start(clientSocket);
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
static void HandleClient(object obj)
{
Socket clientSocket = (Socket)obj;
byte[] buffer = new byte[1024];
string data = "";
while (true)
{
int receivedBytes = clientSocket.Receive(buffer);
data += Encoding.ASCII.GetString(buffer, 0, receivedBytes);
if (data.EndsWith("<EOF>"))
break;
}
Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 发送消息:{data}");
string response = "服务器收到了您的消息。\n";
byte[] msg = Encoding.ASCII.GetBytes(response);
clientSocket.Send(msg);
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
在上面的示例代码中,我们启动一个线程来处理每个新连接。在HandleClient函数中,我们首先接收来自客户端的消息,并继续等待。在接收完整个消息之后,我们向客户端发送一个响应消息,并关闭这个Socket对象。
结论
在本文中,我们演示了如何使用C#实现Socket服务器及多客户端连接的方式。在您编写网络应用程序时,Socket技术可以提供灵活、可靠、高效的数据传输方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现Socket服务器及多客户端连接的方式 - Python技术站