0

私はこのコードを持っていますが、何らかの理由でサーバー側のreadline()行でスタックし、常にクライアントから待機していますが、もう一方の側のクライアントはデータを送信します。

サーバーとクライアントの両方のコードが以下にあります。

サーバーコード

import java.io.*;
import java.net.*;

public class TCPServer {
  public static final int SERVER_PORT = 6789;

  public static void main(String argv[]) throws Exception {
    String clientSentence;
    String capitalizedSentence;

    ServerSocket welcomeSocket = new ServerSocket(SERVER_PORT);

    while (true) {
      Socket connectSocket = welcomeSocket.accept();
      InputStream sin = connectSocket.getInputStream();
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(sin));

      PrintWriter outToClient = new PrintWriter(connectSocket.getOutputStream(), true);
      clientSentence = inFromClient.readLine();

      capitalizedSentence = clientSentence.toUpperCase() + "\r\n";

      outToClient.print(capitalizedSentence);
    }
  }
}

クライアントコード

import java.io.*;
import java.net.Socket;

public class TCPClient {

  public static void main(String[] args) throws Exception { 
    String hostName = "localhost";
    int port = 6789;
    String sentence; 
    String modifiedSentence; 

    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
    Socket clientSocket = new Socket(hostName, port);

    PrintWriter outToServer =  null;
    clientSocket.getOutputStream();

    BufferedReader inFromServer = null;
    inFromServer=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    sentence = inFromUser.readLine(); 
    outToServer.print(sentence + "\r\n");

    modifiedSentence = inFromServer.readLine();
    System.out.println("FROM SERVER: " +modifiedSentence); 
    clientSocket.close(); 
  } 
}
4

1 に答える 1

1

周りの構文エラーを修正した後、問題はクライアント側の出力ストリームの周りでoutToServer使用している方法にあると思います。ドキュメントからPrintWriter

PrintStreamクラスとは異なり、自動フラッシュが有効になっている場合は、改行文字が出力されるたびにではなく、println、printf、またはformatメソッドのいずれかが呼び出されたときにのみ実行されます。これらのメソッドは、改行文字ではなく、プラットフォーム独自の行区切り文字の概念を使用します。

print手動で追加された改行で使用しているため、メッセージがソケットの出力ストリームにフラッシュされることはありません。println代わりに次を使用してこれを修正できると思います。

outToServer.println(sentence);

ソケットストリームを介して任意のデータを送受信するのに適しているため、DataInputStreamandDataOutputStreamの代わりにBufferedReaderandを使用することをお勧めします。PrintWriter

于 2013-03-13T22:25:18.177 に答える