gpt4 book ai didi

java - 通过同一个套接字发送和接收

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:19 26 4
gpt4 key购买 nike

我是 Java 套接字的新手,我在使用同一个套接字发送和接收数据时遇到了问题。

服务器在安卓设备上:

    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); 表示套接字已关闭。

我想让整个套接字保持打开状态,以便在同一套接字上进行更多数据交换,直到发送关闭命令为止。

我显然在这里做错了什么,有什么见解吗?提前致谢!

最佳答案

既不关闭套接字也不关闭输出流。你做一个 shutdownOutput()在客户端:

...
dataOutputStream.write(bufferOut);
System.out.println("Sent");
socket.shutdownOutput();
...

这称为半关闭,因为它只关闭一个方向而使另一个方向打开。

关于java - 通过同一个套接字发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com