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

时间:2014-04-25 07:55:39

标签: c# multithreading

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

多个客户端可以连接到每个端口。连接后,服务器用户可以选择每个客户端并向其发送文本,客户端将响应此文本。 我使用线程来完成这项工作,但是当我尝试在多个端口上进行侦听时,我会收到错误消息

  

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

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

我的源代码:

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)));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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