问题如下
客户端
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",9999);
Send send = new Send(socket);
Receive receive = new Receive(socket);
send.start();
receive.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
服务端
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
Send send = new Send(socket);
Receive receive = new Receive(socket);
send.start();
receive.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
运行之后,确实可以达到客户端和服务端的交互的效果,但是两个mian方法不是结束了吗?
那么服务端的端口不就关闭了吗?那为什么还能继续通信啊?
想法
我的想法是这样的,端口并没有释放掉,释放的只是保存了serverSocket的内存地址
在Server的main方法结束前
Server的main方法结束后
可见,端口确实没有关闭,但是存在隐患,因为此时没用引用指向那块堆内存,之后可能会被gc回收
如果我手动关闭这个端口,还能继续通信吗?
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
Send send = new Send(socket);
Receive receive = new Receive(socket);
send.start();
receive.start();
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
复制代码
我加了serverSocket.close(),结果发现,端口确实被关闭了,但是还是能通信的,这又回到了我最初的问题,因此我又产生了一个想法
计算机仅仅是开放了9999这个端口,我们的Server进程注册了这个端口,虽然已经关闭了端口,但是Server进程已被标识,客户端在给服务端发送消息时,只会去寻找哪个进程是9999端口,而不会去理会9999端口是否开放
最后
我不知道我的想法对不对,望大佬们能够指点一下
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END