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 回答