QQ 的实现大概过程(1) 发起会话的会话端先跟服务器联系,这一端有服务器的IP和端口(2) 服务器接收到会话端的请求后,获取会话端的IP和端口,并且获取接收会话端的唯一 【标志】(QQ号码),然后把根据会话端的唯一标志
    查找接收会话端的IP和端口(没有猜错,每个端的端口都是临时分配)。每个QQ登陆后都要到服务器【注册】,服务器通过这个过程获取ip和端口
    
(3) 完成之后,马上把会话端的请求以及会话端的IP和端口号发送给接收会话端.(4) 接收会话端接收到来自服务器端的请求后,解析得到会话端的IP和端口号,直接跟会话端建立联系(5) 端口是qq启动时分配的。现在的问题是,端口是怎么分配的?有没有类似编程经验的,

解决方案 »

  1.   

    端口分配?要看是服务端还是客户端了。
    服务端需要建立Socket服务,当然是自己指定一个源端口,有冲突则进行异常处理。
    客户端则根据服务端IP和端口进行连接呀。这个问题没有什么可问的啊。一句话:
    服务端自己指定源端口,客户端指定目的端口。客户端源端口则是由OS自行分配的。
      

  2.   

    应该是系统帮你自动帮你制定一个端口的,系统会有自己的算法,总之不去得到的一定是空闲的端口,已经被占用的端口系统不会去再占用的,除非原先的程序不用那个端口了
    你用Socket类里面的getLocationPort() 或者 getPort()分别可以查看自身的端口号和远程连接方的端口号
      

  3.   

    1024以下是保留端口,很多程序,和协议的默认端口都在1024以内,如http是80,ftp是21。所以为了不和已经存在的端口冲突,最好是用 1024以上的端口,但也可能1024以外的端口已经被用,也会冲突,但如果检测到时,可以更换其他的端口。
      

  4.   

    这是我在网上查到的,不知道大家有没有以为:QQ使用的是4000端口
    每多运行一个QQ登陆窗口,使用的端口号加1
    也就是说如果运行了两个QQ,第二个QQ使用的端口号是4001,而不是4000 
      

  5.   

    顺便补充一点:
    QQ在进行文本方式聊天的时候,采用的是UDP协议。
    在使用传文件,语音聊天、视频聊天的时候,才是使用的TCP协议。
    只有用了TCP协议时,服务端与客户端才会建立连接。
    如果你想了解更多,建议你去看看网络原理中的相关知识。
      

  6.   

    楼主说的过程,其实,我理解就是UDP协议的打孔技术。这里面的IP地址和端口号,楼主应该把他们统一理解成Socket,而不是分开来理解。因为,实际使用当中,往往会话的发起方,存在NAT的情况。最后 , 发起方发起会话,一般可以通过两种方式绑定端口:
    一个是由程序(用户)自己定义,然后绑定(但是,很可能会绑定失败,也就是说,端口已经被占用了);
    另一个是由操作系统自行分配(一般不会绑定失败,但是,端口号具有不确定性)。另外,
    我觉得,楼主的理解重心不应该在端口号的获得、分配以及绑定上边。
    我觉得,重点应该在:
          为什么,会话发起方的IP及Port信息,不是由发起方直接告诉给服务器,
          而是由 服务器端获取发起方当前的IP及Port信息 ?很显然,两种方式,得到的信息内容,很可能是不相同的。这就是我刚才强调的 NAT情况。
    也是为什么使用打孔技术的原因。
      

  7.   

    客户端的连接端口不用分配 。
    服务端的端口可以自已分配。ServerSocket("",8888);
      

  8.   

    当然可以咯。我也没说不可以啊。事实上,QQ会话,一般会占用UDP的4000端口。
    4000以后的几个连续端口,有时候也会被QQ占用。
      

  9.   

    java有个开源的包,能够管理socket连接的,功能很强大。可以用配置文件管理服务器监听端口范围,也可配置客户端端口范围。具体名字忘记了