[英]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.