具有多个端口和多个客户端的服务器
本文关键字:客户端 服务器 | 更新日期: 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索引)作为创建参数传递给接受线程。
首先解决这个问题,然后考虑服务器用户与客户端的交互。您将需要某种协议,允许每个客户端/用户识别自己。