2012-06-22 11 views
6

私は2つの部分でプログラムを作ります。ソケット - Javaクライアント、C#サーバ

パート1:C#server-socket PC上で動作し、コマンドをリッスンし、それに応じて動作するアプリケーション。

パート2:ボタンを押すと、コマンドをPCに送信するJavaクライアントソケットアプリケーションが電話で実行されています。

現在、私はクライアントからサーバにコマンドを送ることができます。 しかし私の問題はこれです:特定のコマンドをサーバーに送信すると、サーバーがクライアントに返信し、クライアントがその応答を読み取るようにします。

クライアントが読み込もうとすると、タイムアウトになります。

Javaクライアントプログラム:

class ClientThread implements Runnable 
{ 
    public void run() 
    { 
     try 
     { 
      Socket socket = new Socket(serverIpAddress, serverPort); 
      socket.setSoTimeout(5000); 

      while (true) 
      { 
       try 
       { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.d("Nicklas", "Out it goes"); 
        out.println(Command); 

        if (Command == "CMD:GetOptions<EOF>") 
        { 
         Log.d("Nicklas", "Getting options"); 
         try 
         { 
          Log.d("Nicklas", "Line 1"); 
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
          Log.d("Nicklas", "Line 2"); 
          String answer = in.readLine(); 
          Log.d("Nicklas", "answer = " + answer); 
         } 
         catch (Exception ee) 
         { 
          Log.d("Nicklasasasas", ee.toString()); 
         } 
        } 
        break; 

       } 

       catch (Exception e) 
       { 
        Log.d("Nicklas", "CAE = " + e.toString()); 
        break; 

       } 
      } 
      socket.close(); 
     } 
     catch (ConnectException ee) 
     { 
      Log.d("Nicklas", "Kunne ikke forbinde"); 

     } 
     catch (Exception e) 
     { 
      Log.d("Nicklasssssss", e.toString()); 
     } 
    } 
} 

これを使って呼び出されます。

Thread cThread = new Thread(new ClientThread()); 
     cThread.start(); 

そして押されたものをボタンに応じて、異なる情報が含まれていますグローバル変数 "Command" を、使用しています。

"String answer = in.readline();"という行でプログラムが失敗します。例外は「java.net.SocketTimeoutException」です。

これはプログラムのC#のサーバの一部です:

次のように呼び出され
private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (true) 
     { 
      //blocks until a client has connected to the server 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 

      //create a thread to handle communication 
      //with connected client 
      Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
      clientThread.Start(client); 
     } 
    } 

    private void HandleClientComm(object client) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] message = new byte[4096]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 4096); 
      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

      //message has successfully been received 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      //System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 
      string Input = (encoder.GetString(message, 0, bytesRead)); 
      Input = Input.Trim(); 
      object[] obj = new object[1]; 
      obj[0] = Input; 
      if (Input == "CMD:GetOptions<EOF>") 
      { 
       try 
       { 
        byte[] buffer = encoder.GetBytes("CMD:Accepted"); 
        clientStream.Write(buffer, 0, buffer.Length); 
        clientStream.Flush(); 
        MessageBox.Show("Client program asked for reply"); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show("Oh it no work!: " + e.ToString()); 
       } 
      } 
      else 
      { 
       Udfor(Input); 
      } 


     } 

     tcpClient.Close(); 
    } 

、Form1の(中)

this.tcpListener = new TcpListener(IPAddress.Any, 4532); 
this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
this.listenThread.Start(); 

C#のサーバが正常に動作するようです、と示していメッセージボックス「クライアントプログラムから返信を求められました」

エラーを発見できる人は誰ですか?

+0

クライアントがサーバーからの応答を受け取っていないように見えますか? SocketTimeoutExceptionは、指定されたタイムアウト内にソケットによって応答が受信されなかった場合にスローされます(例では5秒)。サーバーが応答を送信していますか? – Kerry

+0

さて、IM 100%確実ではないが、99% C#プログラム: IF(入力== "CMD:GETOPTIONS ") {バイト[]バッファ= encoder.GetBytes(" CMD:承認")。 clientStream.Write(buffer、0、buffer.Length); clientStream.Flush(); MessageBox.Show( "ああ、zehオプションが必要でした"); } これは、メッセージが受信された後に実行されます。最後にmessageBoxも表示されているので、返信を送信する – user1285334

答えて

1

私はそれを理解しました! 問題はC#です。サーバーがコマンド "CMD:Accepted"を送り返したとき、それは決してソケットを閉じなかったので、アンドロイド・アプリケーションはそれが読み終わったかどうかを知らせなかった!私が既に行った場合には、フラッシュをした直後にソケットを閉じて、もう一度閉じないでください。