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

m0s*_*it0 3 java networking android

我是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");
Run Code Online (Sandbox Code Playgroud)

客户端在带有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");
Run Code Online (Sandbox Code Playgroud)

这里的问题是服务器卡住while (dataInputStream.read() != -1);线路.看起来客户端永远不会关闭发送.

如果我dataOutputStream.close()在客户端部分(当然是在写完之后),那么它确实有效,但随后客户端while (dataInputStream.read() != -1);就说套接字已经关闭.

我希望保持整个套接字打开,以便在同一个套接字上进行更多数据交换,直到发送关闭命令.

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

Ola*_*che 12

你既不关闭套接字也不关闭输出流.您在客户端执行shutdownOutput():

...
dataOutputStream.write(bufferOut);
System.out.println("Sent");
socket.shutdownOutput();
...
Run Code Online (Sandbox Code Playgroud)

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

  • 测试`stream.read()!= -1`表示EOF.如果你不想(一半)关闭流,你必须测试一些其他结束标记,正如@Pyranja已经建议的那样. (2认同)