我是一个新手,对Java sockets并不熟悉,我在使用相同的socket发送和接收数据时遇到了问题。
服务器位于一个Android设备上:
ServerSocket listenSocket = null;
OutputStream dataOutStream = null;
Socket socket = null;
InputStream dataInputStream = null;
// Listen
System.out.println("Start listening");
try {
listenSocket = new ServerSocket(4370);
socket = listenSocket.accept();
System.out.println("Connection accepted");
dataInputStream = socket.getInputStream();
dataOutStream = socket.getOutputStream();
while (dataInputStream.read() != -1);
} catch (IOException e) {
e.printStackTrace();
close(listenSocket, socket);
return;
}
// Answer
System.out.println("Answering...");
byte[] answer = {(byte) 0x82, (byte) 0xf8, 0, 0};
try {
dataOutStream.write(answer);
} catch (IOException e) {
e.printStackTrace();
close(listenSocket, socket);
return;
}
close(listenSocket, socket);
System.out.println("Finished");
客户端运行在安装有 Java 6 的 Linux 机器上:
Socket socket = new Socket("192.168.1.33", 4370);
OutputStream dataOutputStream = socket.getOutputStream();
InputStream dataInputStream = socket.getInputStream();
byte[] bufferOut = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
dataOutputStream.write(bufferOut);
System.out.println("Sent");
while (dataInputStream.read() != -1);
socket.close();
System.out.println("Finished");
问题在于服务器卡在了
while (dataInputStream.read() != -1);
这行代码。看起来客户端从未关闭发送。如果我在客户端部分执行 dataOutputStream.close()
(当然是写入后),那么它确实可以工作,但随后客户端在 while (dataInputStream.read() != -1);
处崩溃,提示套接字已关闭。我希望保持整个套接字开放以进行更多的数据交换,直到发送关闭命令为止。显然我在这里做错了些什么,有什么见解吗?谢谢!
stream.read() != -1
是否为 EOF。如果您不想(半)关闭流,则必须测试其他结束标记,正如 @Pyranja 已经建议的那样。 - Olaf Dietsche