C# 中的 System.Net.Sockets.Socket
类是 .NET Framework 提供的核心类,用于处理网络套接字编程。Socket
类是用于网络编程的基础类,它位于 System.Net.Sockets
命名空间中。
使用 Socket
类,可以创建客户端和服务器应用程序来进行基于TCP、UDP和其他网络协议的通信。
以下是如何在 C# 中使用 Socket 类进行基本的 TCP 服务器和客户端通信的步骤:
TCP 服务器端实现
cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketServer
{
class Program
{
private static byte[] buffer = new byte[1024];
private static int port = 8885; // 定义服务器监听端口
static void Main(string[] args)
{
// 创建一个 IP 地址对象,绑定到本地主机
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
// 创建一个新的 Socket 对象,指定为 IPv4、面向流(TCP)协议
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定服务器 socket 到特定的 IP 和端口
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
serverSocket.Bind(localEndPoint);
// 开始监听连接请求,最大同时排队的连接数为 10
serverSocket.Listen(10);
Console.WriteLine($"启动监听 {serverSocket.LocalEndPoint} 成功");
// 启动线程等待客户端连接
Thread listenThread = new Thread(ListenForClients);
listenThread.Start(serverSocket);
// 等待控制台输入以保持程序运行
Console.ReadLine();
}
private static void ListenForClients(object obj)
{
Socket listener = (Socket)obj;
while (true)
{
// 接受一个客户端的连接请求
Socket clientSocket = listener.Accept();
// 发送欢迎消息给客户端
string welcomeMessage = "ServerSayHello";
byte[] data = Encoding.ASCII.GetBytes(welcomeMessage);
clientSocket.Send(data);
// 在单独的线程中处理来自客户端的消息
Thread receiveThread = new Thread(ReceiveData);
receiveThread.Start(clientSocket);
}
}
private static void ReceiveData(object obj)
{
Socket clientSocket = (Socket)obj;
while (true)
{
try
{
// 接收客户端发来的数据
int received = clientSocket.Receive(buffer);
// 将接收的数据转换为字符串并输出
string message = Encoding.ASCII.GetString(buffer, 0, received);
Console.WriteLine($"接收客户端 {clientSocket.RemoteEndPoint} 消息: {message}");
// 实际应用中,这里可能需要对消息进行响应或进一步处理
}
catch (Exception ex)
{
Console.WriteLine($"接收异常:{ex.Message}");
// 关闭连接
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
break;
}
}
}
}
}
TCP 客户端实现
cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketClient
{
class Program
{
private static byte[] buffer = new byte[1024];
static void Main(string[] args)
{
// 设置要连接的服务器地址和端口
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
int port = 8885;
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// 连接到服务器
clientSocket.Connect(new IPEndPoint(ipAddress, port));
Console.WriteLine("连接服务器成功");
// 接收服务器发送的消息
int receiveLength = clientSocket.Receive(buffer);
Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(buffer, 0, receiveLength));
// 发送多条消息给服务器
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000); // 模拟延时
string sendMessage = $"ClientSendMessageHelp{i} at {DateTime.Now}";
byte[] data = Encoding.ASCII.GetBytes(sendMessage);
clientSocket.Send(data);
Console.WriteLine("向服务器发送消息:{0}", sendMessage);
}
}
catch (Exception ex)
{
Console.WriteLine("连接或通信过程中发生错误: {0}", ex.Message);
}
finally
{
// 关闭连接
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Console.WriteLine("发送完毕,按回车键退出...");
Console.ReadLine();
}
}
}
}
以上代码分别展示了如何创建一个简单的 TCP 服务器和客户端,服务器会监听客户端的连接请求,并在建立连接后与客户端交换数据。
客户端则尝试连接到服务器,并发送和接收数据。
请注意,使用Socket
进行网络编程需要对网络协议和通信原理有一定的了解。
如果需要更复杂的网络通信功能,可能需要使用更高层次的网络库或框架,例如TcpClient
和TcpListener
。