0

コンピューターとサーバー間のソケット通信に問題があります。特定のボタンをクリックした場合にのみ、ソケットを介して通信を確立します。最初のコミュニケーションでは、すべてが完璧に行われます。もう一度クリックすると、コードは実行されません。何が起こっているのかを確認するためにブレークポイントを設定したところ、特定の行で、彼は単にその行を実行しようとしているだけで、長い間実行されていることがわかりました。(私は常に同じパラメータを渡します)。

長時間処理するライン

serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);

クライアントコード

    private void Form1_Load(object sender, EventArgs e)
    {
        msg("Client Started");
        clientSocket.Connect("server_ip", 8855);
        //clientSocket.Connect("127.0.0.1", 8873);
        label1.Text = "Client Socket Program - Server Connected ...";
        this.imprimir();
    }

    protected void imprimir()
    {
        NetworkStream serverStream = clientSocket.GetStream();
        byte[] inStream = new byte[10025];

        //// LINE THAT PROCESS FOR A LONG TIME IN THE SECOND TIME.
        serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);

        string returndata = System.Text.Encoding.ASCII.GetString(inStream);
        int ponto = returndata.IndexOf('.');
        returndata = returndata.Substring(0, ponto);
        string[] quebraretorno = returndata.Split(';');

        ServiceReference1.bematechSoapClient bema = new ServiceReference1.bematechSoapClient();
        string r = bema.InformacoesImovelBematech(quebraretorno[0], quebraretorno[1]);
        int retorno = -1;

        retorno = IniciaPorta("COM7");

        if (retorno == 1)
        {
            ConfiguraModeloImpressora(7);
            BematechTX(r);
            AcionaGuilhotina(1);
            FechaPorta();
        }

        clientSocket.Close();
    }

サーバーコード

 public void btnImprimeBematech_Locacao()
        {
            Utilidade.QuebraToken tk = new Utilidade.QuebraToken();
            int Credenciada = Convert.ToInt32(tk.CarregaToken(1, HttpContext.Current.Request.Cookies["token"].Value));
            TcpListener serverSocket = new TcpListener(8855);
            int requestCount = 0;
            TcpClient clientSocket = default(TcpClient);
            serverSocket.Start();
            clientSocket = serverSocket.AcceptTcpClient();

            requestCount = 0;

            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    string serverResponse = Request.QueryString["id"] + ";" + Credenciada.ToString() + ".";
                    Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);                          
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();                    
                }
                catch (Exception ex)
                {                    
                }
            }

            clientSocket.Close();
            serverSocket.Stop();            
        }

誰でも私を助けることができますか?

4

1 に答える 1

2

最初の通信では、サーバーは新しいソケットを受け入れ、whileループに入ります。ただし、2回目の通信中は、serverSocket.AcceptTCPClient()に戻りません。つまり、whileループから抜け出せず、新しいソケットを受け入れません。

現在接続されているソケットが切断されたときにAcceptTCPClient()に戻るように、サーバー側のコードを編集する必要があります(別のループを追加するだけです)。そして、すでに持っているWhileループに終了条件を提供する必要があります。

     TcpClient clientSocket = default(TcpClient);
            serverSocket.Start();

            while(True)
           {
                clientSocket = serverSocket.AcceptTcpClient()
                requestCount = 0;
                while ((clientSocket.Connected == true))
                {
                  try
                  {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    string serverResponse = Request.QueryString["id"] + ";" + Credenciada.ToString() + ".";
                    Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);                          
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();                    
                  }
                  catch (Exception ex) { }
                }
           }
于 2012-10-25T11:55:38.350 に答える