2016-05-02 11 views
0

クライアントからサーバーへ情報を送信する際に問題があります。 出力が可能になっている:JavaのTCPサーバー

*サーバー:*
$> javaのれるtcpClient /サーバIP/8080現在のクライアントの
ユーザーID:岩の//はこれをプリントアウトしなければならないが、それは
ません。 ..

クライアント
$> javaのTCPServerの8080
タイプのログインが開始し
ログイン //ユーザー入力
FROM SERVER:ユーザーIDでログインしてください。
岩の //ユーザーの入力サーバに送信さ
:岩の
...

しかし、サーバがその文をプリントアウトしていない、それが清掃される必要がバッファやストリーミングに関係していませんアップ?コードは以下に含まれています。

TCPServerのコード:

... 
BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 
DataOutputStream outToClient = 
      new DataOutputStream(connectionSocket.getOutputStream()); 
... 
outToClient.writeBytes("Please log in with your user ID.\n"); 
String clientId = inFromClient.readLine() 
System.out.println("User ID of the current client: " + clientId); 
outToClient.writeBytes("Game has started!\n"); 

れるtcpClientコード:

... 
    DataOutputStream outToServer = 
      new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(
      new InputStreamReader(clientSocket.getInputStream())); 
    ... 
    System.out.println("Type login to start"); 
    if ((inFromUser.readLine()).equals(login)) 
    { 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
      String option = inFromUser.readLine(); 
      outToServer.writeBytes(option); 
      System.out.println("Sent to Server: "+ option); 
      //should print "FROM SERVER: Game has started!" 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
    } 
    ... 
+0

'OutputStream.flush()'を試しましたか? –

+0

デバッグを追加して、何が起こっているかを確認します。 'inFromUser.readLine()'が返すものは何ですか? –

+1

'readLine()'の結果は、他に何かをする前に、nullをチェックする必要があります。 – EJP

答えて

1

あなたは文字ストリームとバイトストリームを混合しています。 DataOutputStreamは通常、文字以外のデータを送信するために使用されます。入力は自由形式であってはならないので、フィールド区切り記号や行終端記号はありません。整数は、正確に4バイトとして送信され、\x0030\x0039の間の可変数ではありません。対照的に、行指向の文字データにはBufferedReaderが使用されます。文字は、ASCIIまたはUTF-16のようなCharsetでエンコードされます。回線は、プラットフォームによっては\nまたは\r\nで終了します。

何をしようとしているかのように、DataOutputStreamの代わりにPrintStreamを使用してください。例えば、

PrintStream outToClient = new PrintStream(connectionSocket.getOutputStream(), true); 
    outToClient.println("Please log in with your user ID."); 

outToServerにも同様のコードを使用してください。

注:PrintStreamコンストラクタに渡された値trueは、改行が送信されたときに自動フラッシュを有効にするので、ほとんどの#flush()コールは不要になります。


EDIT

対称性のためにあなたがBufferedReaderを使用しているので、私はPrintWriterを使用すると述べている必要があります。交換で落ちる;まったく同じように使用します。

PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true); 
outToClient.println("Please log in with your user ID."); 

最後の注意:両方PrintStreamPrintWriter抑制すべてIOException秒。ストリームが終了するなど、例外が発生していないことを確認するには、定期的に#checkError()を使用する必要があります。

関連する問題