生活随笔
收集整理的這篇文章主要介紹了
MFC网络通信程序设计——网络聊天室
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網絡聊天室的設計與實現的具體功能要求如下:
聊天室服務器端的創建。聊天室客戶端的創建。實現客戶與服務器的連接并通信。實現客戶端的實時更新聊天室信息。實現服務器端當前在線多客戶信息。(還未實現)實現聊天室里的所有用戶實時共享信息。
https://download.csdn.net/download/weixin_48453983/13755183
服務器
CaptionID
| 服務啟動 | IDOK |
| 退出服務 | IDCANCEL |
| 發送 | IDC_BUTTON1 |
客戶機
CaptionID
| 進入聊天室 | IDOK |
| 退出聊天室 | IDCANCEL |
| 發送 | IDC_SEND |
消息實現
- 服務啟動:
創建(socket)綁定(bind)套接字ServerSocket,WSAAsyncSelect設置ServerSocket異步模式,監聽客戶連接請求(listen),建立一個客戶接收請求的鏈表結點。 - 發送:
循環遍歷客戶鏈表發送(send)字符串(buff)給連接的客戶機
LRESULT CTestDlg
::OnAccept(WPARAM wParam
, LPARAM lParam
)
{if (WSAGETSELECTERROR(lParam
)){list
.InsertString(0,"Error detected on entry into OnServerAccept.");return 0L;}int nlen
=sizeof(SockAddr
);if(WSAGETSELECTEVENT(lParam
) == FD_ACCEPT
){SOCKET CLIENT
= INVALID_SOCKET
;SOCKET client
;Client
->next
->date
=accept(ServerSocket
,(LPSOCKADDR
)&SockAddr
,&nlen
); if (Client
->next
->date
== INVALID_SOCKET
){list
.InsertString(0,"Server socket failed to accept connection.");return 0L;}ListInsert(Client
, 1, CLIENT
);GetElem(Client
, 2, client
);WSAAsyncSelect(client
,m_hWnd
,WM_CLIENT_READCLOSE
,FD_READ
|FD_CLOSE
);IsTrue
= TRUE
;}return 0L;
}
LRESULT CTestDlg
::OnReadClose(WPARAM wParam
, LPARAM lParam
)
{
CString str1
;switch (WSAGETSELECTEVENT(lParam
)){case FD_READ
:for (int j
= 0; j
< ListLength(Client
); j
++) {SOCKET client
= visit(Client
, j
);if (recv(client
, buff
, sizeof(buff
), 0) != SOCKET_ERROR
){IsTrue
= TRUE
;break;}for (int j
= 0; j
< ListLength(Client
); j
++) {send(visit(Client
, j
), buff
, sizeof(buff
), 0); }break;case FD_CLOSE
:break;}return 0L;
}
- 進入聊天室:
創建窗口輸入服務器IP,創建套接字,連接(connect)服務器,連接成功發送“用戶名+進入聊天室,大家歡迎!”至服務器,WSAAsyncSelect設置異步。
LRESULT CClientTestDlg
::OnReadClose(WPARAM wParam
,LPARAM lParam
)
{CString str
;switch (WSAGETSELECTEVENT(lParam
)){case FD_READ
:if(recv(ServerSocket
,buff
,sizeof(buff
),0) == SOCKET_ERROR
){list
.InsertString(0,"接收數據發生錯誤。");return 0L;}str
.Format("%s",buff
);list
.InsertString(0,str
);break;case FD_CLOSE
:closesocket(ServerSocket
);list
.InsertString(0,"服務器退出?!芾韱T已關閉聊天室");IsTrue
= FALSE
;break;}return 0L;
}
BOOL CClientTestDlg
::DestroyWindow()
{strcpy(buff
, (LPCTSTR
)(StrCname
+ "退出聊天室"));send(ServerSocket
, buff
, sizeof(buff
), 0);WSACleanup();return CDialog
::DestroyWindow();
}
本程序只實現了基本的多人聊天功能,還有很多的功能都沒有能力實現,歡迎大家提出更好的想法和改進的方案~~
總結
以上是生活随笔為你收集整理的MFC网络通信程序设计——网络聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。