2014-04-25 160 views
-1

我需要一个在多个端口上侦听的服务器。具有多个端口和多个客户端的服务器

多个客户端可以连接到每个端口。连接后,服务器用户可以选择每个客户端并向其发送文本,客户端将响应此文本。 我使用的线程这份工作,但是当试图监听多个端口上时,我得到的是说

错误“只有一个使用的每个套接字地址(协议/网络地址/端口)通常是允许的”。

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

我的源代码:

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

回答

0

不不不不不:)您需要将/在其创建的时间信号的端口号在接受()线程,而不是由一些“反”的方式在所有线程的空间。另外,你不应该读取非GUI线程中的列表框。

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

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

相关问题