判断是否已经开了一个实例 本人用Java写了一个类似于QQ的IM软件,现在快结束了遇到了一个问题,如果在一台机子上开两个实例的话他们的端口和ip都相同小溪会分布清楚,所以有没有什么办法,在运行程序之前先检测是否有实例存在,然后我好动态的修改下port,谢啦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 class CTest(){ private CTest(int intPort){} //private禁止外部构造,强制只能使用open打开 private static HashSet<Integer> ms_hsUsedPort=new HashSet<Integer>(); public static CTest open(){ int intPort=randomPort(); while (ms_hsUsedPort.contains(intPort)) intPort=randomPort(); ms_hsUsedPort.add(intPort); return new CTest(intPort); }} 打开一个ServerSocket,第二个实例再打开就会失败 检测 port 有没有被占用 更加好….有的话就用其它… 写配置文件不失为一种不错的办法,web服务器如tomcat就是这么做的,不过这对服务器有用,客户端就不够好了,因为如果要开多个实例(多个qq号码同时登陆一台机器)就无法实现实现方式是多种多样的,只要遵循两个原则就可以了:1)不管是B/S的还是C/S的,S的端口都必须是固定的,已知的,如oracle默认的1531,sqlserver的1433等等;web服务器的默认80,tomcat的8080,weblogic的7001,否则客户端发起连接的时候不知道该连接服务器哪个端口2)对应的,客户端端口必须不固定。与S端正好相反。否则无法支持客户端多实例连接运行对于服务端:端口是一定要在启动之前就确定下来的,这比较好好办。写一个配置文件最好。对于客户端:如果需要多实例,那么如同楼上有一位说的,端口不要硬编码,不论你的IM是基于TCP的还是基于UDP(QQ就是基于UDP的)的,都支持随机绑定本地端口的功能,系统有65535个端口,重复的几率很小(如果你较真,一定要开足够多的程序把端口全占完,那就另当别论),看看你打开多个IE窗口、开多个MSN,多个QQ都可以很好的运行就知道了。你开多个qq然后用netstat -n -a命令看看你的本地端口情况,每个qq的都不一样这种解决办法是最值得推荐的。单实例的,就在你绑定的客户端端口监听,发现端口已经占用,就关闭该端口再尝试连接 弱弱问问,这个办法不行吗?最多再把open同步一下 10楼正解server绑定端口client不绑定,内核自动分配一个大于49152的临时端口号。如果不这样,client断掉重新连接的时候,会有TIME_WAIT的问题 学习了,那用Preferences类可行吗??他是储存到系统里的。 关于Graphics 请教线程问题 关于读取UTF8格式的XML文件的问题 布署在tomcat中的代码想运行一个本地程序,怎么写? 请问JScrollPane如何实现自动下拉? SOS:为何多线程引起机器重启? 如何得到键盘事件(KeyEvent) JBuilder6编辑器一有关键字后边就对不上,百分赠! HttpClient 4.3X cookie 这么用java写一个发送邮件服务器 请问,哪里有JB2008注册 请教一个问题,看了汤阳光老师的视频(贪吃蛇)有个问题一直没解决!
private CTest(int intPort){} //private禁止外部构造,强制只能使用open打开
private static HashSet<Integer> ms_hsUsedPort=new HashSet<Integer>();
public static CTest open(){
int intPort=randomPort();
while (ms_hsUsedPort.contains(intPort)) intPort=randomPort();
ms_hsUsedPort.add(intPort);
return new CTest(intPort);
}
}
1)不管是B/S的还是C/S的,S的端口都必须是固定的,已知的,如oracle默认的1531,sqlserver的1433等等;web服务器的默认80,tomcat的8080,weblogic的7001,否则客户端发起连接的时候不知道该连接服务器哪个端口
2)对应的,客户端端口必须不固定。与S端正好相反。否则无法支持客户端多实例连接运行
对于服务端:端口是一定要在启动之前就确定下来的,这比较好好办。写一个配置文件最好。
对于客户端:
如果需要多实例,那么如同楼上有一位说的,端口不要硬编码,不论你的IM是基于TCP的还是基于UDP(QQ就是基于UDP的)的,都支持随机绑定本地端口的功能,系统有65535个端口,重复的几率很小(如果你较真,一定要开足够多的程序把端口全占完,那就另当别论),看看你打开多个IE窗口、开多个MSN,多个QQ都可以很好的运行就知道了。你开多个qq然后用netstat -n -a命令看看你的本地端口情况,每个qq的都不一样
这种解决办法是最值得推荐的。单实例的,就在你绑定的客户端端口监听,发现端口已经占用,就关闭该端口再尝试连接
弱弱问问,这个办法不行吗?最多再把open同步一下
server绑定端口
client不绑定,内核自动分配一个大于49152的临时端口号。如果不这样,client断掉重新连接的时候,会有TIME_WAIT的问题
学习了,那用Preferences类可行吗??他是储存到系统里的。