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

时间:2021-04-15 12:40:18

标签: c# network-programming tcplistener

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

1 个答案:

答案 0 :(得分:2)

<块引用>

尝试使用 new Thread(Listener(10000)).Start();,但没有按预期工作。

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

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

对于少量的端口,thread-per-port 并不是太糟糕,但我要强调的是,显示的代码是 thread-per-client,这将非常扩展;这不是编写服务器的好方法,除了只有少数(例如:少于 10 个)行为良好的客户端的琐碎事情。