csocket或CAsyncSocket建立的聊天软件,如何像QQ那样,点击列表产生任意个对话框,然后可以随意聊天?一般网上的是一对一的聊天的实例,没见到一对多的像QQ那样的,请高手告诉我如何实现?如果有实例的话可以发去我邮箱:[email protected] 。

解决方案 »

  1.   

    需要从服务器上获取其他好友的IP等信息,然后socket通信
      

  2.   

    聊天室程序,google一下应该很多的
      

  3.   

    一般网上的是一对一的聊天的实例只有一个socket连接。
    一对多,多连几个socket不就可以了
      

  4.   

    一对多的聊天,采用的是UDP广播消息。
      

  5.   

    那楼主的程序应该设置成这样
    在主程序窗口:有个监听SOCKET Socket用于监听会话请求,同时有SOCKET AcceptSocket[20]用于接受请求并会话。来一个会话请求,就从20个AcceptSocket中选个空的AcceptSocket与之连接弹出聊天窗口,并设置该Socket的WM_SOCKET_READ消息的处理窗口句柄。同时还有个SOCKET SendSocket用于发送请求,连接成功后同样设置消息。这样楼主就同时可以和21个人进行会话了。
    下面是我曾经做的一个类似QQ的点对点聊天程序,测试通过的,多用户多窗口聊天。希望对楼主有所帮助
    afx_msg LRESULT CSimpleQDlg::OnServerAccept(WPARAM wParam, LPARAM lParam)
    {
     int nLength = sizeof(SOCKADDR);
     SOCKADDR_IN addr;
         int i;
         if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT)
     {
     for(i=0;(i<20)&&(m_hAcceptSocket[i]!=INVALID_SOCKET);i++) ;//查找空闲AcceptSocket
     if(i==20) return 0; //没有空闲AcceptSocket,直接退出
     m_hAcceptSocket[i] = accept(m_hServerSocket, (LPSOCKADDR)&addr, (LPINT)&nLength);
     //连接成功后首先发生自己的昵称

    int iSize = WideCharToMultiByte(CP_ACP,0,m_staticName,-1,NULL,0,NULL,NULL);
    char *na = new char[iSize];
    WideCharToMultiByte(CP_ACP,0,m_staticName,-1,na,iSize,NULL,NULL);//转化CString类型的IP为char *
    send(m_hAcceptSocket[i],na,strlen(na),0);  CSimpleQWordChat *sqwc=new  CSimpleQWordChat();
     sqwc->SetNickName(m_staticName);
     sqwc->SetPeerIP(CString(inet_ntoa(addr.sin_addr)));
     sqwc->Create(IDD_DIALOG_WORDCHAT,GetDesktopWindow());
     //这一句必须放在Create之后,因为此时窗体句柄m_hWnd才会分配空间
     sqwc->SetSocket(m_hAcceptSocket[i]);
     sqwc->ShowWindow(SW_SHOW); 
     sqwc->UpdateData(false);
     }
    return 0;
    }void CSimpleQWordChat::SetSocket(SOCKET& socket)
    {
    m_hSocket=socket;
    //自定义消息
    WSAAsyncSelect(m_hSocket,this->m_hWnd,WM_SOCKET_READ,FD_READ);
    }要自己处理添加消息处理函数:ON_MESSAGE(WM_SOCKET_READ, &CSimpleQWordChat::OnSocketRead)
    这样某个Socket有数据到来后后就会向指定的窗口m_hWnd发送消息WM_SOCKET_READ,FD_READ是消息通知码。各个窗口间不干扰!