Tomcat中部署的应用关闭后,监听线程没有关闭,仍旧占用端口

发布于 2022-05-01 10:37:33 字数 973 浏览 748 评论 5

因为业务需要,要在原有的系统上面添加一个对外接口,监听并接受外部发送过来的报文。

然后我第一时间想到的就是Socket。然后试了试在写了个类,并在application.xml中配置了bean,结果发现会阻塞应用,导致应用无法成功启动,然后我就在这个里面又用到了线程,能够顺利启动,而且能够完成需求 。但是问题是ServerSocket.accept()这个方法会占用端口,即使在关闭应用之后还是占用这个端口,结果就导致重新启动应用会失败。

想问一下各位大神,有没有好的解决方案或者替代方案,再次谢谢大家了。

贴上代码:

public class MessageServer implements Runnable {
	private Logger logger = LoggerFactory.getLogger(MessageServer.class);
	private static ServerSocket serverSocket ;
	public void init(){
		try{
			serverSocket = new ServerSocket(2000);
		} catch (IOException e) {
			logger.error("启动用户验证服务失败",e);
			throw new RuntimeException("启动用户验证服务失败");
		}
		new Thread(this).start();
	}
	@Override
	public void run() {
		while(true){
			Socket socket = null;
			try {
				while((socket = serverSocket.accept()) != null ){
					new Thread(new UserCheckServer(socket)).start();
				}
			} catch (IOException e) {
				logger.error("连接失败",e);
			}
		}
	}

}

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

高跟鞋的旋律 2022-05-05 21:46:41

不是关闭tomcat之后端口还占用 ,是关闭部署在tomcat中的应用之后端口还是占用着,要是关闭tomcat的话,端口就关闭成功了。但是这个tomcat服务器中还有其他应用,所以就不能为了启动这个应用重启tomcat 了

忆梦 2022-05-05 20:40:52

回复
你的意思是应用停止之后你那个线程还活着?把他设置为守护线程试试

天荒地未老 2022-05-05 09:48:34

回复
@zheng_pat : 这个 要怎么设置呢 ?没用过 守护线程

策马西风 2022-05-03 17:12:18

回复
thread.setDaemon(true)

小…红帽 2022-05-02 16:44:29

只要java进程呗关闭,理论上不会出现端口被占用。你确定tomcat服务停止之后,没有任何java进程,但是端口仍然在的吗

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文