这时毕老师在day26的网络编程的第11个视频,其中有:
/*
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据
* 并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
*/
//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);
//2,获取连接过来的客户端对象。
Socket s = ss.accept();//阻塞式.
String ip = s.getInetAddress().getHostAddress();
老师说accept()是获取连接过来的客户端对象,服务端不需要创建新的socket对象,使用客户端的socket的流进行通信。接着ip就是所在的客户端ip。后来我查看了accept的源码
是这样的
public Socket accept() throws IOException {
if (isClosed())
throw new SocketException("Socket is closed");
if (!isBound())
throw new SocketException("Socket is not bound yet");
Socket s = new Socket((SocketImpl) null);
implAccept(s);
return s;
}
明显新建了一个socket。想想也是,客户服务端中各自一个socket,应用程序与各自socket打交道,发出数据,不同主机利用网络进行传输,然后再各自socket中获取数据。我这理解正确吗?
这样与老师所说的不一样了.但是如果是新建的怎么又可以获取客户端的socket的信息呢?接着我就遐想了,难道是内部有赋值动作吗?
求牛人解答
|