C# TCP服务器监听多个端口

C# TCP server listen to multiple ports

我正在使用以下由 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();
        }
    }
}
}

Tried to use new Thread(Listener(10000)).Start(); but it didn't work as expected.

表达式 Listener(10000) returns void,因此您不能将其用作参数;你需要的是 ThreadStart,所以:

new Thread(() => Listener(10000)).Start();

对于少数端口,每个端口一个线程并不太糟糕,但我要强调显示的代码是每个客户端一个线程,这将扩展可怕;这不是编写服务器的好方法,除了只有少数(如:少于 10 个)行为良好的客户端的琐碎事情。