1.通讯中,做的一个线程对应一个Socket连接,这样当连接过3000时线程就超过了3000。这样就很不稳定,有什么好的解决办法?
2.因为上边的原因,我想过通讯完马上断开连接,然后使用线程池去优化,但是这样一来,就会出来下面的问题:
  U1向U2发消息,两用户均是内网用户,如果两用户不能建立p2p连接,消息将不能通过服务器中转,因为Server和U2的连接已经断开了,Server无法主动向U2发起连接。
3.关于Java中点对点连接,请问谁能提供一些资料,或者代码加上另外两贴,共三百分,解决问题,全部送给大家
http://community.csdn.net/Expert/topic/4939/4939427.xml?temp=.9230158
http://community.csdn.net/Expert/topic/4939/4939442.xml?temp=.4796564

解决方案 »

  1.   

    Registar: 注册员,用于保存User当前的通讯地址,以及通过心跳保持User通讯地址的有效性(其实就是看User是否在线)。
    Server: 服务器。
    Storage: 用于暂时保存需要中转的消息。1 User登录
      User发送自己当前所在的通讯地址(TCP/IP地址)给Registar,Registar保存或更新该通讯地址,并维持与User的心跳,以保证User的通讯地址的有效性。在User登录的同时,Registar告知Server该消息,由Server检查Storage,看是否有要发给User的中转消息,如果有则下发给User。2 UserA发送消息
      UserA要发送消息给UserB,UserA首先询问Registar,向Registar要UserB的通讯地址,得到后直接向UserB发送消息,如果发送消息失败,或是得不到UserB的地址,则将消息发送给Server,Server尝试转发,如果转发失败,将消息保存到Storage中,以后再发。
    MainThread: Server的主线程,侦听端口,接收消息为SocketData,并将SocketData放到MessageQueue中。
    SocketData: 保存接收到的消息和User的Socket。
    MessageQueue: 消息队列,用于保存SocketData。
    WorkThread: 工作线程,可以有多个同时处理,专门一个个处理MessageQueue中的SocketData。简略的伪码如下:class SocketData
    {
        SOCKET m_acceptedSocket;
        Message m_msg;
        ...
    };MainThread:
            ...
            Socket.Listen;
            while(Continue)
            {
                SocketData.m_acceptedSocket = Socket.Accept;
                MessageQueue.Put(SocketData);
                ...
            }
            ...WorkThread:
            ...
            while(Continue)
            {
                SocketData = MessageQueue.Get();
                DoSomething(SocketData);
                ...
            }
            ...
      

  2.   

    长连接的话,线程太多了
    短连接的话, U1向U2发消息,两用户均是内网用户,如果两用户不能建立p2p连接,消息将不能通过服务器中转,因为Server和U2的连接已经断开了,Server无法主动向U2发起连接。问题应该怎么解决呢?