我正在使用下面由 Rick Miller (Pulp Free Press) 创建的代码。我需要在多个端口上接收数据,为每个端口打开独立的线程。
尝试使用 new Thread(Listener(10000)).Start();但它没有按预期工作。
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class MultiThreadedEchoServer {
public static void Main() {
Listener(10000);
}
private static void Listener(int port) {
TcpListener listener = null;
try {
listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Console.WriteLine("MultiThreadedEchoServer started...");
while (true) {
Console.WriteLine("Waiting for incoming client connections...");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Accepted new client connection...");
Thread t = new Thread(ProcessClientRequests);
t.Start(client);
}
} catch (Exception e) {
Console.WriteLine(e);
} finally {
if (listener != null) {
listener.Stop();
}
}
}
private static void ProcessClientRequests(object argument) {
TcpClient client = (TcpClient)argument;
client.ReceiveBufferSize = 4096;
try {
StreamReader reader = new StreamReader(client.GetStream());
StreamWriter writer = new StreamWriter(client.GetStream());
string s = String.Empty;
while (!(s = reader.ReadLine()).Equals("Exit") || (s == null)) {
Console.WriteLine("From client -> " + s);
writer.WriteLine("From server -> " + s);
writer.Flush();
}
reader.Close();
writer.Close();
client.Close();
Console.WriteLine("Closing client connection!");
} catch (IOException) {
Console.WriteLine("Problem with client communication. Exiting thread.");
} finally {
if (client != null) {
client.Close();
}
}
}
}
答案 0 :(得分:2)
尝试使用 new Thread(Listener(10000)).Start();
,但没有按预期工作。
表达式 Listener(10000)
返回 void
,因此您不能将其用作参数;你需要的是一个 ThreadStart
,所以:
new Thread(() => Listener(10000)).Start();
对于少量的端口,thread-per-port 并不是太糟糕,但我要强调的是,显示的代码是 thread-per-client,这将非常扩展;这不是编写服务器的好方法,除了只有少数(例如:少于 10 个)行为良好的客户端的琐碎事情。