接。
比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,
使得服务器能够及时掌握客户端的连接状态把对方客户的退出信息及时发送到对等实体上。
客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。
该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,
发送和接收聊天信息完成上述各项功能。
第三章 系统概述
在这里主要是对于上章中的功能实现问题进行相关叙述,
将分成两部分来叙述第一部分进行该聊天软件的简要介绍
第二部分将相关执行的截图加到此文中。
第一部分
本身此毕业设计的构成就是由大量代码以及相关模块,
每个部分每个控制甚至包括文本的插入符相关控制都是由代码来实现
例如:
创建插入符:
void CreateSolidCaret( int nWidth, int nHeight );//创建插入符
void CreateCaret( CBitmap* pBitmap );//创建位图插入符
void ShowCaret( );//显示插入符
void HideCaret( );//隐藏插入符
static void PASCAL SetCaretPos( POINT point );//移动插入符号
说明:
1)创建插入符要在窗口创建完成之后
CreateSolidCaret函数创建的插入符被初始化为隐藏
所以需要调用ShowCaret()将其显示。
2)使用CreateCaret函数创建位图插入符的时候,
不能使用局部的位图对象关联位图资源。
(与资源相关联的C++对象,当它析构的时候会同时把与它相关联的资源销毁。
)
所以每个部分都由大量程序然后进行反复调试来实现。
具体实现的步骤将在第四章进行具体叙述,
在此
只做相关概述。
服务器端:
首先要开启服务器功能,
编写相关代码然后指定开启服务器功能的端口
在程序视图显示提示信息的函数相关视图可自行创建。
创建服务器端Socket,类型为SOCK_STREAM,
面向连接的通信
设置相关命与选定的端口绑定设定服务器相应的网络事件为FD_ACCEPT
即连接请求。
产生相应传递给窗口的消息为WM_SERVER_ACCEPT,
开始监听客户链接请求然后设置变量确定监视服务器是否 被打开。
响应客户发送聊天文字到服务器:
ON_MESSAGE(WM_CLIENT_READ, OnClientRead),
设置MAXClient是服务器可响应连接的最大数目
用可控缓冲接收函数recv()来接收字符然后服务器端接受显示文字
编写的函数向所有连接的客户广播这个客户的聊天文字。
m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
//创建服务器端Socket,
类型为SOCK_STREAM面向连接的通信
if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
{ ReportWinsockErr("无法创建服务器socket!");
return;}
m_pDoc->m_sockServerAddr.sin_family = AF_INET;
m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr,
sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{ReportWinsockErr("无法绑定服务器socket!");
对于客户断开连接
会产生一个FD_CLOSE消息只须相应地用closesocket()关闭相应的Socket即可
这个处理比较简单。
客户端:
首先链接到服务器,创建面向连接的Socket,
使用TCP/IP协议
如下:
sockAddr.sin_port=m_iPort; //客户端指定的IP地址
sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //请求连接
当完成连接或者未能链接设置相关代码具体见附录。
MessageBox("连接成功!",NULL,MB_OK);
int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);
//指定响应的事件,
为服务器发送来字符
if(iErrorCode==SOCKET_ERROR)
MessageBox("WSAAsyncSelect设定失败!");
}
接收服务器端发送的字符也使用可控缓冲接收函数recv()
客户端聊天的字符发送使用数据可控缓冲发送函数send()
这两个过程比较简单在此就不加赘述了。
根据对用户的要求及功能设置可以得到以下的流程图3.1,
用户首先启动客户端登陆服务器并向服务器发送信息
启动服务器服务器等待客户要求并向客户反馈在线用户信息
用户向服务器发送信息服务器处理用户的数据
然后用户开始聊天。
客户端的聊天分为对所有人的信息和私聊的信息,
该信息应通过程序控制分别进行处理。
设计流程图
通过CSocket类提供的功能实现。
从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。
服务器只需要一个侦听套接字CListenSocket,
然后根据客户的连接请求动态创建客户套接字CClientSocket。
客户套接字的数量是不可预知的,因此需要一个列表来记录。
MFC的CPtrList类就能实现这种功能。
在编程软件Visual C++6.0基础上采用TCP协议的网络编程实现一款客户端到客户端的聊天程序,其中能使用VC的一些基本控件将程序的设计分为客户端与服务器。
其中此程序客户端要与服务器相连时,首先输入服务器端的端口号(注意连接为0时连接失败,
只要端口号大于0就可进行聊天了)客户端要在界面上输入相应的端口号和本地主机的IP地址。
在客户端与服务器相连后在发送的文本框中输入你想发送的信息然后点击发送客户端(服务器)就能在接收的文本框内显示出相应的内容。
第二部分
模块设计
服务器端:
弹出初始化对话框:
创建监听套接字
更新所有客户端:
将新信息发送给每个客户端
处理客户端的连接信息:
生成一个新的套节字与客户端通讯;将该套节字保存起来
接收数据:
定义缓冲区;接收数据;将数据在列表框中显示出来;将数据
发送给每个客户
客户端
显示登录对话框:
创建一个新的Socket;连接服务器;发送登录消息给服务器。
显示登录对话框:
创建一个新的Sock
上一篇:
基于VC的聊天系统毕业论文
下一篇:
近三年来思想工作小结(德能勤绩廉)