簡體   English   中英

具有多個端口和多個客戶端的服務器

[英]Server with multiple ports and multiple clients

我需要一個監聽多個端口的服務器。

多個客戶端可以連接到每個端口。 連接后,服務器用戶可以選擇每個客戶端並向其發送文本,客戶端將響應此文本。 我使用線程來完成這項工作,但是當嘗試偵聽多個端口時,我收到一個錯誤消息

“通常每個套接字地址(協議/網絡地址/端口)只允許使用一次”。

如何解決此問題,以及如何在客戶端連接到服務器並向其發送文本后訪問線程?

我的源代碼:

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 索引作為創建參數傳遞給接受線程。

首先解決這個問題,然后考慮與客戶端交互的服務器用戶。 您將需要某種協議來允許每個客戶端/用戶識別自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM