基于VS的网络聊天室设计与实现

2020-09-29 07:51宋毅
电脑知识与技术 2020年17期
关键词:聊天室

宋毅

摘要:随着网络编程应用软件普及,用户使用网络应用更加广泛,对于技术人员掌握多线程技术在网络程序设计中的应用,理解流式套接字程序设计模型,熟悉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).

【通联编辑:代影】

猜你喜欢
聊天室
欢乐聊天室
欢乐聊天室
百万级SUV聊天室(5人)
名画家的聊天室
阅读理解两则