在做一个类似QQ的聊天软件,正在实现好友聊天模块,两个人单个聊天已经可以实现,问题是当一个人与多个人聊天时,会有多个聊天窗口接受不同的好友发来的信息,因为只有一个SOCKET来接受,所以当接收后会根据接收到数据传来的一个窗口ID来确定哪个窗口接受消息,从而确定是哪个好友发过来的消息,如何将这些窗口与SOCKET关联呢?因为在窗口创建时就关系到该是哪个窗口接受,还要通知好友客户端往这个窗口ID上发消息,我想了一些方法感觉都很烂,特求教一个比较好的实现算法,我第一次真正知道算法的重要性

解决方案 »

  1.   

    你对消息发送的方式理解有误吧。这种情况下,不是跟窗口所关联的。就是说,假设A给B和C发消息,中转服务器就会把消息发给B和C,B和C收到消息后,会分析其中的信息,这时候由本地的B和C中处理发给哪个窗口,其实根据每个人的QQ号,就可以记录窗口和QQ号的关系,这个是在本地记录的。通讯不与本地窗口发生关系
      

  2.   

    你的第二个方案就可行吧。窗口创建的时候,就给窗口一个ID号(可以将窗口的句柄和ID 号做一个映射,或者,就用简单的数组对应),窗口发送消息和接受消息都附带上这个ID号,如果客户端接收到一个消息,就提取这个消息的窗口ID号,更加ID号,得到对应的窗口句柄,然后发送消息。
    ===============================================
    算法很重要,,
    另外我觉得这个更本不是算法问题,这个只是一个软件设计的问题。
      

  3.   

    SOCKET当然不能和窗口绑定了,那怎么行,你得有一个数据包接收/派发机制.
    不管你有和几个人同时聊天(也就是不管同时有几个SOCKET连接)收到消息后把所有消息都传送给一个消息分析器,由消息分析器具体分析这个消息是哪个人发的,然后再找到对应的窗口把聊天数据发送给窗口.
    也就是SOCKET是个底层的东西window是上层的东西,通过一个管道把他们相连,而不是直接搞在一起
      

  4.   

    你建立连接的时候,服务器不就有相对应的关系了么?服务器按照这个关系进行数据的发送和接受,本地有什么问题吗?
    每个好友的号码不同,最初Findwindow找到这个对应的窗口就行,服务器传过来的消息当中一定包含好友的ID或者号码,一一对应就行了
      

  5.   

    不是的,可能是我说的太模糊了,我的clientSOCKET在OnReceive调用recvfrom后,会分析收到数据中的一个窗口ID,然后让这个窗口PostMessage并把收到的数据作为参数传递,我首先是和服务器通信,获得另一个好友客户端的iP和信息,然后通过p2p方法两个客户端直接交谈,现在一个和一个交谈已经实现了,我现在缺少的是一种好的算法,大家再给出出主意吧
      

  6.   

    这不是算法,而是设计模式,你可以采用观察者模式。让每个窗口在监听者那里注册一个Entry,里面包含窗口句柄和该窗口对应的聊天对象的ID,接收到数据后,根据对应聊天对象的ID去寻找窗口句柄,并向该窗口发送消息进行通知。
      

  7.   

    得到数据后,数据中不是有数据结构么?数据结构中设计好传送的ID,接受方接受到数据后进行解析,根据发送ID不同发送到不同的窗口
      

  8.   

    用一台数据库服务器提供用户注册!
    每次发送消息时加上自己的ID号后面在跟消息!
    接收到消息之后去数据库中查询昵称!
    首先根据昵称判断窗口有没有,用FindWindow
    如果有将消息给那个窗口,如果没有先创建,在给那个窗口!
      

  9.   

    创建窗口时,窗口标题就是好友的昵称,这样用findwindow函数才更好查找!
      

  10.   

    呵呵,我这一天可一点都没偷懒啊,终于搞的差不多了,用以前的设计方案结果是乱七八糟的的,今天早晨想到了在每个Folder的BarItem里面增加两个成员变量,一个事data结构,保存这个好友的IP地址和端口和Id,一个保存自己与这个好友聊天的对话框指针,通过判断是否为空来决定收到信息时是直接显示还是先让头像晃动,然后收到信息由主窗口来接受,根据信息中的ID决定哪个窗口或Item来接受处理消息。看来,设计一个好的流程图是多么重要啊,呵呵,小菜我让大家见笑了