网络编程——互联网多人聊天系统

网络编程——互联网多人聊天系统写在前面该篇文章只是介绍性内容,完整的资源(包括代码)在主页资源→互联网多人聊天系统中目录中文摘要第1章系统开发基础技术1.1项目内容介绍1.2相关技术11.3相关技术21.4相关技术3第2章系统分析2.1系统需求分析2.2系统概要设计2.3系统详细设计第3章系统开发3.1系统开发环境配置3.2系统开发第4章系统测试4.1测试环境4.2功能测试4.3测试结果分析第5章开发过程的问题及解决方案…

写在前面

该篇文章只是介绍性内容,完整的资源(包括代码)在主页资源→互联网多人聊天系统中

目    录

中文摘要

第1章 系统开发基础技术

1.1项目内容介绍

1.2相关技术1

1.3相关技术2

1.4相关技术3

第2章 系统分析

2.1系统需求分析

2.2系统概要设计

2.3系统详细设计

第3章 系统开发

3.1系统开发环境配置

3.2 系统开发

第4章 系统测试

4.1 测试环境

4.2功能测试

4.3测试结果分析

第5章 开发过程的问题及解决方案

第6章 结 论

参考文献


中文摘要

主要内容:本系统主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注