遇到问题,望大佬指点

问题如下

客户端

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的内存地址

image.png

在Server的main方法结束前
image.png

Server的main方法结束后
image.png
可见,端口确实没有关闭,但是存在隐患,因为此时没用引用指向那块堆内存,之后可能会被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
喜欢就支持一下吧
点赞0 分享