我正在学习java,我遇到了套接字的一些问题。我开发了一个简单的客户端 - 服务器应用程序 - 有点敲门,它执行了4个步骤:
第4步出现问题:客户端没有收到消息,也从未退出循环:
while ((inStr = in.readLine()) != null) {
writer.println(inStr);
}
其中in是BufferedReader
的类型:
try {
socket = new Socket(ipAddress, 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
在服务器端发送消息:
try {
socket = srvSocket.accept();
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
...
out.println("test from server #1");
out.println("test from server #2");
客户端我看了in.ready()
- 它返回false。在服务器端,我看out.checkError()
- 它返回true;
我做错了什么 - 为什么流是空的?
任何帮助我都很感激! :)
答案 0 :(得分:2)
您正在使用public PrintWriter(OutputStream out, boolean autoFlush)
,它会在新行或println
上自动刷新。 每次写入后都不会自动刷新。每次写入后都必须刷新。
这是构造函数的autoFlush参数的javadoc:
布尔值;如果true
,println
,printf
或format
方法将刷新输出缓冲区
答案 1 :(得分:-1)
这可能/可能无法解决您的问题。但请尝试将所有内容保留在Try Catch块中。例如:您的ServerSocket初始化,写入程序块等。如果发生某些错误,您可能无论如何都无法使用编写器,因此初始化它没有意义。
您可以尝试写入标准输出流以进行调试而不是文件。下面的服务器/客户端代码是您和它的工作的一个小变体。
服务器:
Socket socket;
ServerSocket srvSocket;
BufferedReader in;
PrintWriter out;
try {
srvSocket=new ServerSocket(4444);
socket = srvSocket.accept();
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("test from server #1");
out.println("test from server #2");
} catch (IOException e) {
e.printStackTrace();
}
客户端
Socket socket;
BufferedReader in;
PrintWriter out;
String inStr;
try {
socket = new Socket("127.0.0.1", 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((inStr = in.readLine()) != null) {
System.out.println(inStr);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}