2

サーバー アプリケーションとクライアント アプリケーションがあります。サーバーとクライアント間の通信にソケットを使用しています。クライアント接続が 1 つしかない場合は、すべて正常に機能します。アップロード、ダウンロードはすべて正常に機能します。

しかし、別のクライアント接続がある場合 (クライアント アプリケーションを再度開始します。これは、コンピューターで 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 がスレッド化を処理します。ファイルをアップロードする Web サービスを作成するのは非常に簡単です...

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 に答える