宋毅
摘要:隨著網絡編程應用軟件普及,用戶使用網絡應用更加廣泛,對于技術人員掌握多線程技術在網絡程序設計中的應用,理解流式套接字程序設計模型,熟悉WinSock套接字庫的加載,熟練掌握各類WinSock中API函數。該聊天室分為客戶端和服務器端兩端設計與實現。設計網絡聊天室對于用戶具有實際應用價值。
關鍵詞:VS;網絡編程;聊天室
中圖分類號:TP311 ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2020)17-0085-02
Abstract:With the popularization of network programming application software, users use network applications more widely. For technicians to master the application of multithreading technology in network programming, understand the flow socket programming model, be familiar with the loading of Winsock socket socket library, and master API functions in various Winsock. The chat room is divided into client and server-side design and implementation. The design of network chat room has practical application value for users.
Key words:VS;network programming;chat room
1 基礎知識
WinSock的加載,建立監聽、接受連接、數據發送和數據接受使用的WinSock中的listen、connect、send和recv;發送數據是.NET中寬字節和多字節的相互轉換;線程函數的定義和線程啟動。
2 設計步驟
2.1 服務端程序設計
1)創建項目
創建一個對話框應用程序,項目名稱為“Fuwuqi”,在創建向導中設置“Windows套接字”,支持網絡編程,其他采用默認設置,設計對話框如圖1所示。添加一個列表控件,為其關聯CListCtrl類型的變量m_list,設置控件的View屬性為report,添加編輯框,為其關聯CString類型的變量bianjikuang,添加按鈕,為其建立消息映射。注意,添加成員變量過程如果有誤,請刪除對應頭文件和源文件內的成員變量名字,重新填寫即可。
2)修改FuwuqiDlg.h文件,頭文件需要添加例如變量的聲明等
在FuwuqiDlg.h文件中添加線程函數聲明,代碼如下,注意不要在類內寫。
UINT thread(LPVOID)
3)編輯服務器端函數內容,寫入對應程序
對話框程序自己帶初始化功能,初始化計數器相關參數,首先調試這個函數的核心代碼如下:
libiaokuang.InsertColumn(0,_T("消息"));//列表框內容顯示信息
libiaokuang.SetColumnWidth(0,435); //設置列表框寬度
bianjikuang.fuwu.sin_family=AF_INET;
fuwu.sin_port=5000;/;
addlen=sizeof(fuwu);
sock=socket(AF_INET,SOCK_STREAM,0); //創建socket
if (bind(sock,(sockaddr*)&fuwu,addlen)) ?//綁定
bianjikuang = _T("綁定錯誤");
else
{
m_edit = _T("服務器創建成功");
listen(sock,5); ? ? ? //開始偵聽
AfxBeginThread(&thread,0); ? ?//調用線程
}
//更新數據包
// 除非將焦點設置到控件,否則返回TRUE
}
void CFuwuerDlg::OnBnClickedSend()//發送消息核心代碼
{
libiaokuang.InsertItem(jishuqi++,bianjikuang);//插入計數統計
msgjishuqi=dlg->getjishuqi();//獲得客戶端flag { ?s=1; ?dlg->taojiezi[msgjishuqi]=accept(dlg->sock,(sockaddr*)&(dlg->fuwu),&(dlg->addlen));
if (dlg->taojiezi[msgjishuqi]==INVALID_SOCKET) /判斷連接是否有效套接字
dlg->bianjikuang = _T("連接錯誤");
else
{ AfxBeginThread(thread,0); ? ? ?//啟動線程
dlg->libiaokuang.InsertItem(dlg->jishuqi++,_T("連接成功"));
dlg->libiaokuang.Scroll(chicun);
while(s!=SOCKET_ERROR) ? ? //循環接收數據
{ s=recv(dlg->taojiezi[msgjishuqi],buff,100,0);
CString temp; //定義臨時變量
DWORD dwNum = ::MultiByteToWideChar (
CP_ACP, 0, buff, -1, NULL, 0);
wchar_t *pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, buff, -1, pwText, dwNum);
temp.Format(_T("%s"),pwText);
delete []pwText;
//異常處理
dlg->libiaokuang.InsertItem(dlg->jishuqi++,_T("斷開連接"));
dlg->libiaokuang.Scroll(chicun);
dlg->taojiezi[msgjishuqi]=NULL;
for (int m=0;m<100;m++)
if (dlg->taojiezi[m]!=NULL) flag=1;
closesocket(dlg->taojiezi[msgjishuqi]);}} //終止線程
}
//getjishuqi()實現獲得還沒有使用的socket數組號
//sendtoall(SOCKET s,char *buff) 實現向所有客戶發送數據
2.2 客戶端程序設計
1)創建項目
創建一個對話框應用程序,項目名稱為“Kehuaduan”,在創建向導中設置“Windows套接字”,支持網絡編程,其他采用默認設置。添加一個列表控件,為其關聯CListCtrl類型的變量libiaokuang,設置控件的View屬性為report,添加兩個編輯框,分別為其關聯CString類型的變量m_ip和m_message,添加兩個按鈕,為其建立消息映射。
2)修改KehuaduanDlg.h文件,添加代碼如下:
在KehuaduanDlg.h文件中添加線程函數聲明,代碼如下,注意不要在類內寫。
UINT thread(LPVOID);
3)修改KehuaduanDlg.cpp,各函數的代碼如下:
連接服務器核心
clisock=socket(AF_INET,SOCK_STREAM,0); //創建socket
AfxBeginThread(thread,0); ? ? //啟動線程
//發送消息和服務器端類似
UINT thread(LPVOID v) //客戶端接收線程核心
{ connect(dlg->clisock,(sockaddr*)&(dlg->cli),chicunof(dlg->cli)); //連接到服務器
dlg->libiaokuang.InsertItem(dlg->jishuqi++,_T("連接成功"));
while(s!=SOCKET_ERROR) ? ? ? ?//循環獲得數據
{ s=recv(dlg->clisock,buff,100,0); ? ?//調用recv函數接收數據
CString temp;
DWORD dwNum = ::MultiByteToWideChar (CP_ACP, 0, buff, -1, NULL, 0);
wchar_t *pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, buff, -1, pwText, dwNum);
temp.Format(_T("%s"),pwText);
delete []pwText;
dlg->libiaokuang.InsertItem(dlg->jishuqi++,temp);
dlg->libiaokuang.Scroll(chicun); }
send(dlg->clisock,"斷開連接",100,0); ? ? //發送斷開命令
closesocket(dlg->clisock);
}
編譯、鏈接并運行兩個對話框程序,首先建立服務器監聽,然后客戶端連接服務器,即可運行測試。
參考文獻:
[1] 任海峰,趙君.移動學習國內外研究現狀分析[J].成人教育,2010,30(1):95-96.
[2] 聶維,劉小豫.基于Linux的聊天室的設計與實現[J].電腦與電信,2018(9):27-28.
[3] 任琴,孔令慧,秦冰.基于JAVA的多人聊天室的系統設計[J].時代農機,2018,45(1):142.
[4] 董敏,桑建建.基于Linux的網絡聊天系統的設計[J].信息與電腦(理論版),2017(23):142-143.
[5] 張萍萍,紀志堅.基于Python的聊天軟件的設計與實現[J].網絡安全技術與應用,2017(5):67-71.
[6] 常穎.基于ASP網絡聊天室設計與實現[J].電子技術與軟件工程,2017(05):70-71.
[7] 畢娜.局域網聊天室系統的設計與實現[J].福建電腦,2016,32(5):135-136,145.
[8] 胡楠.網頁即時聊天系統的設計與實現[J].信息與電腦(理論版),2015(7):19,21.
[9] 張龍.聊天系統的設計與實現[D].大連:大連理工大學,2015.
[10] Wenjun Yang,Jiaying Zhang,Chundong Wang,et al. Situation prediction of large-scale Internet of Things network security[J].EURASIP Journal on Information Security,2019,2019(1).
【通聯編輯:代影】