2

我有一个服务器应用程序和一个客户端应用程序。我正在使用套接字在服务器和客户端之间进行通信。如果只有一个客户端连接,一切正常:上传、下载一切正常。

但是如果有另一个客户端连接(我再次启动客户端应用程序,这意味着我的计算机上运行着 2 个客户端应用程序和 1 个服务器应用程序),我的服务器开始出现问题:服务器没有从客户端接收文件上传,客户端无法从服务器下载。

在服务器代码中,我已经为每个客户端连接使用了多线程,所以我无法找出问题所在。这是我的服务器代码:

    private void ServerForm_Load(object sender, System.EventArgs e)
            {

                //...
                Thread th = new Thread(new ThreadStart(ListenForPeers));
                th.Start();
            }

    public void ListenForPeers()
            {
                    serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    serversocket.Blocking = true;
                    IPHostEntry IPHost = Dns.GetHostEntry(server);
                    string[] aliases = IPHost.Aliases;
                    IPAddress[] addr = IPHost.AddressList;
                    IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090);
                    serversocket.Bind(ipepServer);
                    serversocket.Listen(-1);
                    while (true)
                    {
                        clientsock = serversocket.Accept();
                        if (clientsock.Connected)
                        {
                            total_clients_connected++;
                            AppendText("Client connected...");
                            Thread tc = new Thread(new ThreadStart(listenclient));
                            tc.Start();
                        }
             }


    void listenclient()
        {
             // start communication
        }

我的服务器代码是否有问题使其无法成为多客户端服务器系统?非常感谢您的帮助。提前致谢。

4

3 回答 3

4

看起来您已将 clientSocket 定义为供所有服务器线程使用的全局变量,而不是您希望它成为每个线程的本地引用。您可以使用 ParameterizedThreadStart 执行此操作:

public void listenForPeers()
{
  //Setup the server socket

  while(true){
    Socket newClient = serverSock.Accept();
    if(newClient.Connected){
      Thread tc = new Thread(new ParameterizedThreadStart(listenclient));
      tc.start(newClient);
    }
  }
}

void listenclient(object clientSockObj)
{
  Socket clientSock = (Socket)clientSockObj;

  //communication to client via clientSock.
}
于 2011-01-03T21:15:55.330 回答
1

首先,您将套接字的 Blocking 属性设置为 true。这将阻止任何请求,直到前一个请求完成......

见这里: http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.blocking (VS.80).aspx

如果您处于阻塞模式,并且您进行了未立即完成的方法调用,您的应用程序将阻塞执行,直到请求的操作完成。如果要在请求的操作未完成的情况下继续执行,请将 Blocking 属性更改为 false。Blocking 属性对异步方法没有影响。如果您正在异步发送和接收数据并希望阻止执行,请使用 ManualResetEvent 类。

您可能想重新考虑这样做,而是使用 WCF 或 Web 服务来上传文件......这会容易得多,并且 IIS 将为您处理线程。编写一个网络服务来上传文件非常容易......

http://www.c-sharpcorner.com/UploadFile/scottlysle/UploadwithCSharpWS05032007121259PM/UploadwithCSharpWS.aspx

于 2011-01-03T21:01:21.407 回答
0

试试这个

const int noOfClients = 5;

for(int i=0;i<noOfClients;i++)
{
  Thread th = new Thread(new ThreadStart(ListenForPeers));
  th.Start();
}
于 2013-03-08T09:33:23.267 回答