该篇文章只是介绍性内容,完整的资源(包括代码)在主页资源→互联网多人聊天系统中
目 录
中文摘要
主要内容:本系统主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的IP地址与服务器进行通信,服务器启动后将在这个指定的端口号中等待客户的连接。通过分析发现,该程序完全可以通过Visual C++中MFC完成[1]。其中网络上查询了一些函数调用以及套接字建立的方法。
效果: 实现了简单的多人聊天
不足:还不能实现从群聊中选择一个人进行私聊,不能发送图片或者文件。
关键词: vc; mfc; c/s模式
第1章 系统开发基础技术
1.1 项目内容介绍
本文讨论一种基于Socket的网络聊天的设计与具体实现方法。基于Socket的网络聊天软件可以为网络内用户提供一种快捷,良好,方便的通信方式,网络内的全部机子可以通过一个服务器建立的聊天室进行聊天。对于它的实现,用户不需对原有的网络硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地提高网络的使用效率,可以很好地解决用户内部网络的即时通信需求。运用MFC技术,基于vc++平台进行开发。
1.2 相关技术MFC
MFC,微软基础类,实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++SDK(SDK,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC同VC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的。MFC作为与VC++血肉相连的部分MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的。
1.3 相关技术Winsock
Windows Sockets规范定义了一套Micosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口.应用程序调用Windows Sockets的API实现相互之间的通讯[2]。
1.4 相关技术c/s
C/S模式是指一个服务器同时为多个客户端服务。并发性是C/S模式的的基础,正是由于并发性的支持,多个客户端能够获得同一种服务,而不需要向每个用户端建立连接后在发送消息。在C/S模式中,当请求到达服务器时,服务器将它交给一个控制线程,它能与已有的线程并发的执行,这样就大大减轻了服务端的任务
第2章 系统分析
2.1 系统需求分析
实现多人聊天室通信功能,采取服务器先接受信息,再对客户端进行转发。
C/S模式图如下图所示
2.2 系统概要设计
系统构架图如下
通过聊天系统的分析并结合现实情况,可以设计出整个系统的总体流程结构,如图所示:
服务器与客户端是通过套接字来进行通信的。
在基于TCP的网络通信程序中,首先服务器端通过socket()函数创建套接字,然后通过bind()函数来命名套接字,调用listen()函数开启服务器端的监听。接着执行accept()函数来接收客户的连接,服务器阻塞等待客户连接请求,直到有客户请求连接。
客户端创建套接字,接着通过connect()函数请求连接服务器,连接成功后,就可以与服务器进行通信了。
服务器与客户机通过send()各recv()调用来进行信息的发送和接收。只有当有信息可接收时,recv()才返回,否则将阻塞。
通信完后,服务器和客户机各自通过closesocket()函数来关闭套接字。
2.3 系统详细设计
m_server = socket(AF_INET,SOCK_STREAM,0);
利用listen(m_server,50)开始监听客户链接请求,然后确定监视服务器是否 被打开。响应客户发送聊天文字到服务器。
void CServerDlg::OnOK() //监听绑定
首先链接到服务器,创建面向连接的Socket,使用TCP/IP协议[8],如下:
sockaddr_in serveraddr;
UpdateData(TRUE);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(m_port);
serveraddr.sin_addr.S_un.S_addr = inet_addr(m_IP);
创建连接:
connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) //请求连接
MessageBox(“连接成功!”,NULL,MB_OK);
客户端发送数据:
void CClientDlg::OnButton1() //发送
改写对话框的PreTranslateMessage方法,解获对话框消息,接受数据
BOOL CClientDlg::PreTranslateMessage(MSG* pMsg)
接收数据:
void CClientDlg::ReceiveData()
第3章 系统开发
3.1 系统开发环境配置
1) 动态链接库ws2_32.dll
ws2_32.dll是Windows Sockets应用程序接口, 用于支持Internet和网络应用程序。程序运行时会自动调用ws2_32.dll文件,ws2_32.dll是个动态链接库文件位于系统文件夹中。Windows在查找动态链接库文件时会先在应用程序当前目录搜索,如果没有找到然后才会搜索Windows所在目录;
(2) winpcap 驱动
Winpcap是windows平台下一个免费,公共的网络访问系统。是为win32应用程序提供访问网络底层的能力。其主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据包[6]。
(3)开发工具:Visual C++6.0
3.2 系统开发
首先要开启服务器功能,编写相关代码,然后指定开启服务器功能的端口,在程序视图显示提示信息的函数,相关视图可自行创建。创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信,设置相关命令与选定的端口绑定。WSAAsyncSelect将网络中的事件关联到窗口的消息函数中。实现代码如下:
m_server = socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(m_server,m_hWnd,20000,FD_WRITE|FD_READ|FD_ACCEPT);
利用listen(m_server,50)开始监听客户链接请求,然后确定监视服务器是否 被打开。响应客户发送聊天文字到服务器。
void CServerDlg::OnOK() //监听绑定
{
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
m_IP.GetWindowText(m_serverIP);
serveraddr.sin_addr.S_un.S_addr = inet_addr(m_serverIP);
UpdateData(TRUE);
serveraddr.sin_port = htons(m_port);
if (bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox(“绑定地址失败.”);
return;
}
listen(m_server,50);
}
设置MAXNUM是服务器可响应连接的最大数目,用可控缓冲接收函数recv()来接收字符[7],然后服务器端接受显示文字,编写的函数,向所有连接的客户广播这个客户的聊天文字。部分代码如下:
sockaddr_in serveraddr;
char buffer[1024];
int len =sizeof(serveraddr);
//接收客户端的数据
num= recv(m_Clients[p],buffer,1024,0);
buffer[num]= 0;
if (num==-1) //接受客户端的连接
{
m_Clients[m_CurClient] = accept(m_server,(struct sockaddr*)&serveraddr,&len);
m_CurClient+=1;
}
//将接收的数据发送给客户端
for (int j = 0;j< m_CurClient;j++)
if (j != curlink)
send(m_Clients[j],buffer,num,0);
}
首先链接到服务器,创建面向连接的Socket,使用TCP/IP协议[8],如下:
sockaddr_in serveraddr;
UpdateData(TRUE);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(m_port);
serveraddr.sin_addr.S_un.S_addr = inet_addr(m_IP);
创建连接:
connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) //请求连接
MessageBox(“连接成功!”,NULL,MB_OK);
客户端发送数据:
void CClientDlg::OnButton1() //发送
{
CString str,name,info ;
m_name.GetWindowText(name);
m_info.GetWindowText(str);
if (!name.IsEmpty()&&!str.IsEmpty())
{
info.Format(“%s说: %s”,name,str);
//开始发送数据
int i = send(m_client,info.GetBuffer(0),info.GetLength(),0);
m_list.AddString(info);
m_info.SetWindowText(“”);
}
}
//改写对话框的PreTranslateMessage方法,解获对话框消息,接受数据
BOOL CClientDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message==1000)
{
ReceiveData();
return TRUE;
}
else
return CDialog::PreTranslateMessage(pMsg);
}
接收数据:
void CClientDlg::ReceiveData()
{
char buffer[1024];
//接收服务器端传来的数据,
int num = recv(m_client,buffer,1024,0);
buffer[num] = 0;
//将接收的数据添加到列表框中
m_list.AddString(buffer);
}
程序流程图如下图
第4章 系统测试
4.1测试环境
VS 2017
4.2功能测试
运行服务端出现如下界面
设置服务器端口,点击设置。
运行客户端出现如下图,输入IP地址,端口号以及昵称
如果IP地址和端口号正确,如下图
如果不正确,则有
现在同时登陆多个客户端进行聊天,即打开多个客户端
4.3 测试结果分析
实现了简单的多人聊天系统,但是客户端下线时没有在公屏提醒,实现了主要的功能,还有些许瑕疵没有解决。
第5章开发过程的问题及解决方案
最难的是系统详细设计和编码阶段,在这个阶段,由于自己动手不足和对开发工具的陌生,最主要的是,对知识还不是熟练地掌握,系统遇到了很多大大小小的问题,如如何利用多线程,所以我的聊天程序是一个很简单的客户端与客户端的聊天程序。
第6章 结 论
内容:简单的基于VC的聊天系统基本完成,系统基本功能基本实现,测试运行也基本正常。该系统基本上完成了客户端与服务器的连接,实现了客户端与客户端的聊天并显示相应记录。
当然这个系统还存在许多有待完善的地方:功能相对较少,有待于添加,比方说像客户端与服务器相互发送信息,文件传输等功能,用户登录加密等。
参考文献
[1] 侯俊杰.《深入浅出MFC第2版[M]》.华中科技大学出版社.2002年
[2] 杨祥金、杨丹、李永新.《Windows程序设计教程[M]》.清华大学出版社.2007
[3] 王金保.《基于Winsock的Chat设计[J]》.辽宁石油化工大学学报.2004年 第04期
[4]张越.Visual C++网络程序设计实例详解[M].北京:人民邮电出版社,2006.
[5]张正秋.WINDOWS程序捆绑核心编程[M].北京:清华大学出版社,2007.
[6] 赵辉、叶子青.《Visual C++系统开发实例精粹[M]》.人民邮电出版社.2006
[7] 王振江. 《VC++环境下WinSock编程及实例分析[J]》. 四川电力技术.2003年第06期
[8] 马亲民,熊文辉.《利用MFC Socket类实现TCP/IP通信[J]》.通信技术.2002年第01期。
今天的文章网络编程——互联网多人聊天系统分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27440.html