2012-03-28 8 views
4

javaクライアントとC#クライアントの間でソケット通信が必要ですが、問題はC#クライアントが自分のJavaサーバーからメッセージを受信できないことです。サーバーが動作します。Java <-> C#ソケット:メッセージを受信できない

私のワークフロー:

  1. のJava:サーバー
  2. のJavaを作成します。クライアント接続
  3. C#のを待っている:クライアント
  4. のC#を作成します。サーバー
  5. のC#への接続を構築します。送信サーバへのmsg
  6. Java:msg received
  7. java:msgを送る#client
  8. c#:サーバーからメッセージを受信< - これは、クライアントがメッセージを待つが、決して取得しないポイントです。

のJava Serverコード:

public class Communicator { 

    private int m_port; 
    private Socket m_socket; 
    private ServerSocket m_serverSocket; 

    public Communicator(int port) { 
     this.m_port = port; 
     initConnection(); 
    } 

    private void initConnection() { 

     try { 
      System.out.println("Creating Server"); 
      m_serverSocket = new ServerSocket(m_port); 
      System.out.println("Waiting for client connection"); 
      m_socket = m_serverSocket.accept(); 
      System.out.println("Connection made"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String sendMsg(JSONMessage msg) { 
     try { 

    //get msg 
    BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(m_socket.getInputStream())); 
    System.out.println("Waiting for msg..."); 
     String answer = bufferedReader.readLine(); 
     System.out.println("Received: " + answer); 

     //send msg 
     PrintWriter writer = new PrintWriter(m_socket.getOutputStream(),true); 
     writer.print(msg.getMsg()); 
     System.out.println("Sending: " + msg.getMsg()); 

     writer.flush(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

     return ""; 
    } 

} 

私のC#クライアントコード:

class Communicator 
    { 
     private int m_port; 
     private Thread mainThread; 

     public Communicator(int port) 
     { 
      m_port = port; 
      mainThread = new Thread(new ThreadStart(this.initConnection)); 
      mainThread.Start(); 
     } 

     public void initConnection() 
     { 
      IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), m_port); 
      Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      try 
      { 
       Console.WriteLine("Trying to build connection"); 
       server.Connect(ip); 
       Console.WriteLine("Connection successful"); 

       NetworkStream ns = new NetworkStream(server); 
       StreamReader sr = new StreamReader(ns); 
       StreamWriter sw = new StreamWriter(ns); 
       string data; 

       string welcome = "Hello"; 
       Console.WriteLine("Sending: " + welcome); 
       sw.WriteLine(welcome); 
       sw.Flush(); 

       Console.WriteLine("Receiving..."); 
       data = sr.ReadLine(); 
       // --> NEVER REACHING THIS POINT <--- 
       Console.WriteLine("Received: " + data);           

      } 
      catch (SocketException e) 
      { 
       Console.WriteLine("Connection failed."); 
       return; 
      } 

     } 
    } 

誰かが、それは私のクライアントコードConsole.WriteLine("Received: " + data);に到達したことがない理由を任意のアイデアを持っていますか?

私はすでに両側に待機していました。例外やエラーは発生していないので、私の問題がどこにあるのかは分かりません。

おかげ

答えて

2

println()を使用すると、print()の代わりに新しい行が追加されます。 Javaでは、readLineは新しい行を待っていて、C#で同じことをすると思います。 printlnも自動的にフラッシュされるため、フラッシュする必要はありません。

この接続のmreoを一度に使用する場合は、接続用にBufferedReaderとPrintWriterを保持する必要があります。 (ソケットが作成された/受け入れられた後にこれらを作成することをお勧めします)。同じソケットに対してこれらを複数回作成すると、エラーが発生しやすく混乱する可能性があります。

4

あなたの受信機がラインを期待している場合は、あなたの送信者はラインを送信する必要があります。送信者は回線を送信しないので、受信者は受信者が受信するまで永遠に待機します。

今後これらの問題を回避するには、プロトコルがどのように動作するかを、理想的にはバイトレベルで説明する仕様書を作成する必要があります。プロトコルにメッセージが含まれているかどうか、送信者がメッセージの境界をどのようにマークしているか、受信者がメッセージをどのように識別しているかを指定する必要があります。

ここでは、受信者は行末を検索してメッセージの境界を特定します。しかし、あなたの送信者は行末でメッセージ境界をマークしません。受信機は永遠に待ちます。

プロトコル仕様があれば、これは明らかでした。将来、実装するすべてのプロトコルを指定する時間を投資することを強くお勧めします。

+0

writer.println(msg.getMsg())に変更します。または、C#でReadLineを使用せずにsr.Readを使用します。 – weismat

+0

'sr.Read'を使うと、彼はメッセージの境界を全く特定できません。それは彼がやっていることに依存するかもしれません。 –

+0

JavaサーバーにもJavaクライアントがある場合は、JavaサーバーではなくC#クライアントを変更する必要があります。 JSONでは、ifが有効なJSONメッセージであるかどうかを判断するのは簡単です。 – weismat

関連する問題