我很新的Java套接字和我有问题使用相同的套接字发送和接收数据。发送和接收通过相同的套接字
的服务器是在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");
客户端Linux机器上运行的Java 6:
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);
,表示套接字已关闭。
我想保持整个套接字打开,通过这个套接字进行更多的数据交换,直到发送关闭命令。
我明显在这里做错了什么,有什么见解?提前致谢!
如果可以预先确定消息的长度,则还可以发送前几个字节(例如4个字节)以指示要跟随的有效载荷的长度。 – sgp15
感谢您的回答,但除TCP之外,我无法使用任何其他功能。这是通过TCP实现的一个协议。 – m0skit0
从技术上说,SOAP和REST确实使用TCP ...(:但是使用包含以下数据长度的头文件作为@sgp15建议的也是一个可行的替代方案,可以简化错误处理。一般来说,如果要使用套接字连接,您必须以某种方式定义一个通信协议,该协议明确标记了交换消息的边界。 – Pyranja