我有这个代码,由于某种原因它停留在服务器端的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();
}
}
答案 0 :(得分:1)
在outToServer
周围修复语法错误之后,我认为问题在于您在客户端的输出流周围使用PrintWriter
的方式。 From the documentation:
与PrintStream类不同,如果启用了自动刷新,它将会 只有在println,printf或format方法之一时才能完成 调用,而不是每当换行符都出现时 输出。这些方法使用平台自己的行分隔符概念 而不是换行符。
由于您正在使用print
手动添加新行,因此消息永远不会刷新到套接字的输出流。我相信您可以使用println
来解决此问题:
outToServer.println(sentence);
更好的方法是使用DataInputStream
和DataOutputStream
代替BufferedReader
和PrintWriter
,因为它们更适合通过套接字流发送和接收任意数据。