实现两个socket server
server1
using System;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Comm2
{
public class SocketServer
{
// 定义委托,用于事件处理
public delegate void ClientConnectedHandler(object sender, Socket clientSocket);
// 定义OnAccept事件
public event ClientConnectedHandler? OnAccept;
private Socket _serverSocket;
private Thread? _listenThread;
private bool _isListening;
public SocketServer()
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_isListening = false;
}
// 启动服务并监听连接
public void Start(int port)
{
if (_isListening)
{
throw new InvalidOperationException("Server is already listening.");
}
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
_serverSocket.Listen(100);
_isListening = true;
_listenThread = new Thread(ListenForClients);
_listenThread.IsBackground = true;
_listenThread.Start();
}
// 停止服务
public void Stop()
{
if (!_isListening)
{
return;
}
_isListening = false;
_serverSocket.Close();
if (_listenThread != null && _listenThread.IsAlive)
{
_listenThread.Join();
}
}
// 监听客户端连接的方法
private void ListenForClients()
{
while (_isListening)
{
try
{
Socket clientSocket = _serverSocket.Accept();
OnAccept?.Invoke(this, clientSocket);
}
catch (ObjectDisposedException)
{
// Socket已经关闭,退出监听循环
break;
}
catch (Exception ex)
{
Console.WriteLine("Error accepting client: " + ex.Message);
}
}
}
}
}
server2
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Comm2
{
public class SocketServer2
{
private Socket _serverSocket;
private bool _isListening;
public SocketServer2()
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_isListening = false;
}
// 启动服务并监听连接
public void Start(int port)
{
if (_isListening)
{
throw new InvalidOperationException("Server is already listening.");
}
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
_serverSocket.Listen(100);
_isListening = true;
}
// 停止服务
public void Stop()
{
if (!_isListening)
{
return;
}
_isListening = false;
_serverSocket.Close();
}
// 监听客户端连接的方法
public Socket? AcceptOnce()
{
if (_isListening)
{
try
{
Socket clientSocket = _serverSocket.Accept();
return clientSocket;
}
catch (ObjectDisposedException ex)
{
Console.WriteLine("Socket已经关闭,退出监听循环: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Error accepting client: " + ex.Message);
}
}
return null;
}
}
}
client
using System;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Comm2
{
public class SocketClient
{
// 定义委托,用于事件处理
public delegate void MessageReceivedHandler(object sender, string message);
// 定义事件
public event MessageReceivedHandler? OnMsg;
private Socket _socket;
private Thread? _receiveThread;
private bool _isConnected;
public SocketClient()
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_isConnected = false;
}
// 连接到服务器
public void Connect(string serverIP, int serverPort)
{
try
{
_socket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort));
_isConnected = true;
// 开始接收线程
_receiveThread = new Thread(ReceiveData);
_receiveThread.IsBackground = true;
_receiveThread.Start();
}
catch (Exception ex)
{
Console.WriteLine("Error connecting to server: " + ex.Message);
}
}
// 发送数据到服务器
public void Send(string message)
{
if (!_isConnected)
{
Console.WriteLine("Not connected to the server.");
return;
}
byte[] dataToSend = Encoding.ASCII.GetBytes(message);
try
{
_socket.Send(dataToSend);
}
catch (Exception ex)
{
Console.WriteLine("Error sending data: " + ex.Message);
}
}
// 接收数据的方法
private void ReceiveData()
{
byte[] buffer = new byte[1024];
while (_isConnected)
{
try
{
int received = _socket.Receive(buffer);
if (received > 0)
{
string receivedMessage = Encoding.ASCII.GetString(buffer, 0, received);
OnMsg?.Invoke(this, receivedMessage);
}
}
catch (Exception ex)
{
// 如果连接断开,则退出循环
_isConnected = false;
Console.WriteLine("Disconnected from server. " + ex.Message);
break;
}
}
// 关闭Socket
_socket.Close();
}
// 断开与服务器的连接
public void Disconnect()
{
if (_isConnected)
{
_isConnected = false;
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
if (_receiveThread != null && _receiveThread.IsAlive)
{
_receiveThread.Join();
_receiveThread = null;
}
}
}
}
}
使用 客户端
using Comm2;
using System.Net.Sockets;
class Program
{
static void Main(string[] args) {
int port = 1080;
SocketClient client = new SocketClient();
// 订阅OnMsg事件
client.OnMsg += (object sender, string message)=>
{
Console.WriteLine("Received from server: " + message);
};
// 连接到服务器
client.Connect("127.0.0.1", port);
Task task1 = Task.Run(() => {
for (int i = 0; i < 10; i++)
{
// 发送数据
client.Send("Hello, Server! " + i.ToString());
Thread.Sleep(1000);
}
// 断开连接
client.Disconnect();
});
SocketClient client2 = new SocketClient();
// 订阅OnMsg事件
client2.OnMsg += (object sender, string message) =>
{
Console.WriteLine("2 Received from server: " + message);
};
// 连接到服务器
client2.Connect("127.0.0.1", port);
Task task2 = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
// 发送数据
client2.Send("2 Hello, Server! " + i.ToString());
Thread.Sleep(1000);
}
// 断开连接
client2.Disconnect();
});
Task.WaitAll([task1, task2]);
// 等待用户输入以退出
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
}
}
使用 服务端
using Comm2;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
class Program
{
private static int ctrlPort = 1080, dataPort = 2080;
static void Main(string[] args)
{
SocketServer2 ctrlServer = new SocketServer2();
ctrlServer.Start(ctrlPort);
Task.Run(async () =>
{
Socket? clientSocket;
while ((clientSocket = ctrlServer.AcceptOnce())!=null)
{
while(true)
{
byte[] buffer = new byte[1024];
int received = await clientSocket.ReceiveAsync(buffer, SocketFlags.None);
if (received == 0) break; // 客户端断开连接
string receivedData = Encoding.ASCII.GetString(buffer, 0, received);
Console.WriteLine("Received from client: " + receivedData);
string response = "Hello, resp:" + receivedData;
byte[] dataToSend = Encoding.ASCII.GetBytes(response);
await clientSocket.SendAsync(dataToSend, SocketFlags.None);
}
}
});
Console.Read();
}
static void Main2(string[] args)
{
SocketServer ctrlServer = new SocketServer();
ctrlServer.OnAccept += onCtrlMsg;
ctrlServer.Start(ctrlPort);
SocketServer dataServer = new SocketServer();
dataServer.OnAccept += onDataMsg;
dataServer.Start(dataPort);
Console.WriteLine("Hello, World! Running at port:" + ctrlPort.ToString() + " " + dataPort.ToString());
Console.Read();
}
public static void onCtrlMsg(Object sender, Socket clientSocket)
{
Task.Run(async () =>
{
try
{
Console.WriteLine("New client connected.");
byte[] buffer = new byte[1024];
while (true)
{
int received = await clientSocket.ReceiveAsync(buffer, SocketFlags.None);
if (received == 0) break; // 客户端断开连接
string receivedData = Encoding.ASCII.GetString(buffer, 0, received);
Console.WriteLine("Received from client: " + receivedData);
string response = "Hello, resp:" + receivedData;
byte[] dataToSend = Encoding.ASCII.GetBytes(response);
await clientSocket.SendAsync(dataToSend, SocketFlags.None);
}
}
catch (Exception ex)
{
Console.WriteLine("Error handling client: " + ex.Message);
}
finally
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Console.WriteLine("Client disconnected.");
}
});
}
public static void onDataMsg(Object sender, Socket clientSocket)
{
Task.Run(async () =>
{
try
{
Console.WriteLine("2 New client connected.");
byte[] buffer = new byte[1024];
while (true)
{
int received = await clientSocket.ReceiveAsync(buffer, SocketFlags.None);
if (received == 0) break; // 客户端断开连接
string receivedData = Encoding.ASCII.GetString(buffer, 0, received);
Console.WriteLine("2 Received from client: " + receivedData);
string response = "2 Hello, resp:" + receivedData;
byte[] dataToSend = Encoding.ASCII.GetBytes(response);
await clientSocket.SendAsync(dataToSend, SocketFlags.None);
}
}
catch (Exception ex)
{
Console.WriteLine("2 Error handling client: " + ex.Message);
}
finally
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Console.WriteLine("2 Client disconnected.");
}
});
}
}
ivandgetic/v2rayReverseProxy (github.com)

浙公网安备 33010602011771号