本人用Java写了一个类似于QQ的IM软件,现在快结束了遇到了一个问题,如果在一台机子上开两个实例的话他们的端口和ip都相同小溪会分布清楚,所以有没有什么办法,在运行程序之前先检测是否有实例存在,然后我好动态的修改下port,谢啦

解决方案 »

  1.   

    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);
      }
    }
      

  2.   

    打开一个ServerSocket,第二个实例再打开就会失败
      

  3.   

    检测 port 有没有被占用 更加好….有的话就用其它…
      

  4.   

    写配置文件不失为一种不错的办法,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的都不一样
    这种解决办法是最值得推荐的。单实例的,就在你绑定的客户端端口监听,发现端口已经占用,就关闭该端口再尝试连接
      

  5.   


    弱弱问问,这个办法不行吗?最多再把open同步一下
      

  6.   

    10楼正解
    server绑定端口
    client不绑定,内核自动分配一个大于49152的临时端口号。如果不这样,client断掉重新连接的时候,会有TIME_WAIT的问题
      

  7.   


    学习了,那用Preferences类可行吗??他是储存到系统里的。