Java中Socket通信的一个注意点

在使用socket通信时,我们可能会注意到这样一个现象:

客户端通过新建的Socket对象获取输入流,读取服务器端传输给自己的内容。

Socket socket = new Socket("127.0.0.1", 8086);
InputStream  is = socket.getInputStream();
is.read()

服务器端通过accept方法获取Socket对象,然后再获取输入流,读取客户端传输给自己的内容。

 ServerSocket serverSocket = new ServerSocket(8086);
        Socket client = null;
        while (true){
            client = serverSocket.accept();
            InputStream is = client.getInputStream();
            is.read()
        }

这点就让我很疑惑,为什么同一个InputStream对象,在服务器端可以读取客户端传输内容,在客户端可以读取服务器端传输内容。后来经过验证发现,服务器端accept得到的socket对象和客户端新建的socket对象其实并不是同一个,这样就造成了二者各自获得流对象都是不同的,也就解释了上面的疑问。放入代码证明:

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class SocketClient {
    public static InputStream is;

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8086);
        is = socket.getInputStream();
    }
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8086);
        Socket client = null;
        while (true){
            client = serverSocket.accept();
            System.out.println(client.getInputStream()==SocketClient.is);
        }
    }
}

 可能这个问题很低级,知识还是不牢靠啊。

posted @ 2023-07-07 09:18  rockdow  阅读(42)  评论(0)    收藏  举报