武汉纺织大学2012届毕业设计论文
4-14用户界面
添加好友,输入五位数的ID,点确定,若ID存在则成功,如图4-15:
4-15添加好友
好友列表,显示好友ID、昵称、状态和消息数,如图4-16:
25
武汉纺织大学2012届毕业设计论文
图4-16好友信息
4.4.3 聊天窗口
聊天窗口,既可以实现普通的消息传送,如图4-17:
图4-17传送消息
此部分包括简单的数据交流,还有文件和文件夹的传输,如图4-18:
图4-18发送文件和文件夹
26
武汉纺织大学2012届毕业设计论文
5 总体设计
5.1 socket网络图
客户端和服务端的网络通信socket原理图如图5-1所示:
服务器
Socket() Bind() Listen() 客户机 Socket() Accept() 阻塞 等待客户数 建立连接 Read() Connect() Write() 请求服务 处理服务请求 应答数据 Write() Close() 图5-1 udp协议图 5.2 整体框架
Read() Close() 客户端与主机使用TCP协议,客户端与客户端之前使用UDP协议。与服务器之间的连接主要是发送如注册、登陆、查找添加好友等。与另一个客户端间的连接主要是发送、接收相关请求,包括普通的聊天消息,状态改变,文件、文件夹的操作。聊天框是采用多窗口,非必须弹框式聊天方式。比如几个好友可能给你发送了消息,这时后台会创建几个窗口,并把聊天内容显示在窗口里,但窗口最开始是隐藏的,只是在登陆后界面上提示某用户 给你发送了消息,你需要双击才用户列表项才能显现相应的窗口。
由于UDP不是面向连接的,为了区别数据包的发送者,会在每个请求包头后的四个字节 ,填充上该用户的数字ID值,这样便能对不同用户的请求作区别。
27
武汉纺织大学2012届毕业设计论文
前文中提到聊天框的多窗口,非必须弹框属性,在此对此作详细介绍。客户
端用户有一个当前好友列表数据Friendlist,其中每个用户数据的结构体如下:
struct Friend {
unsigned int id;
char name[20];
//数字id
//昵称
SOCKADDR_IN ip_addr; //ip地址
CDialog *pChatBox; //对该好友聊天框窗口的 指针 char statue; //好友状态 SOCKET UdpSocketToFrd; //UDP套接字
u_short udp_port; //好友绑定的UDP端口
BOOL iswndopen; //判断与好友的当前窗口是否已经打开的标志 BOOL RecvMsg; //是否有消息到来
};
如果好友没有上线,我们会置UDP套接字为NULL,这样即便你点开窗口,发送聊天内容,实际上是没有发送。发送事件的过程会判断当前套接字是否为NULL,是则证明好友不在线,也就不必要发送出数据包。
当你双击好友列表项时,程序会先检查iswndopen这个标志位,为真证明窗口已经打开,这时只需要通过窗口指针调用显示窗口函数即可显示该窗口。如果该标志位为否,证明我们还没有创建该窗口,这时先创建一个非模态的聊天框,同时把窗口指针赋给pChatBox,并置iswndopen为真。在创建该聊天框时,对该窗口的成员变量赋值,如果需要修改里面的值 ,我们可以通过pChatBox,引用他的成员变量。例如,如果好友不在线,而我们点开了该窗口,显然窗口的成员变量m_UdpSocketToFrd,也是为NULL。刚好这时候该好友又上线了,这时我们就需要修改窗口的成员变量m_UdpSocketToFrd,显然通过pChatBox很容易做到。这样便提高了程序的性能。
5.3 客户端请求协议及处理方式
28
相关推荐: