具有多个端口和多个客户端的服务器

本文关键字:客户端 服务器 | 更新日期: 2023-09-27 18:00:18

我需要一个在多个端口上侦听的服务器。

多个客户端可以连接到每个端口。连接后,服务器用户可以选择每个客户端并向其发送文本,客户端将对此文本作出响应。我在这项工作中使用了线程,但当尝试在多个端口上侦听时,我收到一个错误,显示

"每个套接字地址(协议/网络地址/端口)通常只允许使用一次"。

如何解决这个问题,以及如何在客户端连接到服务器并向其发送文本后访问线程?

我的源代码:

private void activeToolStripMenuItem_Click(object sender, EventArgs e)
{
    //for each port entered in list box,make a thread
    if (ListBox1.Items.Count != 0)
    {
        activeToolStripMenuItem.Enabled = false;
        inactiveToolStripMenuItem.Enabled = true;
        for ( i = 0; i < ListBox1.Items.Count; ++i)
        {
            serverThread = new Thread(new ThreadStart(StartServer));
            serverThread.Start();
        }
    }
    else
    {
        MessageBox.Show("You Should Add at least 1 port, to Listening Ports List.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
private void StartServer()
{
    counter = counter + 1;
    string Remote_Host_IP;
    int j = i - 1;
    port = Convert.ToInt32(ListBox1.Items[counter]);
    TcpListener listener = new TcpListener(IPAddress.Any, port);
    listener.Start();
    while (true)
    {
        mainSocket = listener.AcceptSocket();
        // you'll need some more thread stuff down here.
        if (mainSocket.Connected)
        {
            Connected_Num = Connected_Num + 1;
            Remote_Host_IP = mainSocket.RemoteEndPoint.ToString();
            this.Invoke(new MethodInvoker(() => AddConnection(Remote_Host_IP)));
        }
    }
}

具有多个端口和多个客户端的服务器

Nononono:)您需要在accept()线程创建时将端口号传递/用信号通知它,而不是通过所有线程空间中的某个"计数器"。此外,您不应该在非GUI线程中读取列表框。

迭代列表并从GUI线程事件处理程序中的ListBox获取端口号,然后将端口号(而不是ListBox索引)作为创建参数传递给接受线程。

首先解决这个问题,然后考虑服务器用户与客户端的交互。您将需要某种协议,允许每个客户端/用户识别自己。