1、i题 目: 网络聊天室的设计与实现 学 号姓 名专业班级指导教师实践日期目 录一、综合训练目的与要求 .1ii二、综合训练任务 .1(1)服务器端实现的功能 .1(2)客户端实现的功能 .1三、总体设计 .1(1)系统结构设计 .1(2)通信设计 .2四、详细设计说明 .2(1)系统调用的相关函数 .2(2)通信连接实现说明 .3(3)额外功能实现说明 .4五、调试与测试 .4六、实习日志 .6七、实习总结 .7八、附录:核心代码清单 .71一、综合训练目的与要求目的:需要提供客户端和服务器,所有用户通过客户端连接服务器进行注册登录后才能进行聊天,进入聊天室有功能选择,用户可以选择群聊功能,或
2、者可以看所有上线用户,或者查看帮助菜单,每次消息发送都带有系统时间要求:任何用户通过客户端注册后登录到服务器进行聊天,服务器需要为守护进程。二、综合训练任务(1)服务器端实现的功能能够正确并且成功开启服务器,服务器为守护进程监听相应的客户端端口,等待客户端用户的连接能建立与客户端用户请求的连接接收客户端发来的注册请求消息,能在服务器端进行注册信息保存接受用户的登录请求信息,能在服务器检验验证用户的登录信息,信息正确的用户可以连接到服务器进行操作,并能够在客户端显示当前的用户上线当用户请求群聊时,服务器可以将客户端发过来的信息传给所有在线用户当用户请求查看当前在线用户时,服务器正确反馈给客户端在
3、线用户客户端请求下线时,提示当前用户下线,服务器将要关闭时提示客户端及时关闭(2)客户端实现的功能能够正确启动成功客户端并发出连接请求能够向服务器发送注册请求,输入用户名和密码保存到服务器能够向服务器发送登录请求,服务器具有验证系统,正确的用户名和密码可以连接服务器,登录聊天室。聊天室,中发送信息,并且所有用户都能收到可以向服务器发出请求群聊的请求,向所有在线用户发送消息可以向服务器发送查看当前在线用户的请求,获得当前在线用户的信息发送消息的实时记录,发送消息可以考到当前系统的时间能够断开与服务器的连接,退出聊天室三、总体设计(1)系统结构设计本系统采用客户/服务器模型,在 TCP/IP 网络
4、应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model) ,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户端/服务器模式的2TCP/IP。在客户/服务器模型中,多个相互通信的计算机都作为客
5、户端,与网络服务器进行连接,并通过服务器进行信息的传递 4。所以多个客户端之间的通信就变为了客户端与服务端的通信。本聊天室系统采用了客户端/服务器形式,即客户端向服务器发送连接请求,服务器收到请求后,提供给客户端相应的服务。服务器主要是处理客户输入信息。首先要存储客户的个人资料,相当于注册。再有,在客户聊天时,也要记录下客户的聊天时间,已备查当前时间。当然,服务器还有自己的动态数据处理。客户状态分为在线客户和非在线客户,我采用结构体存储链接客户信息,以链表来记录连接客户。当客户一连接服务器时,就给客户一个 ID,也就是相当于注册信息,同时并发服务器一直在为连接用户创建线程。系统的总体设计是服务
6、器端和客户端,组成如下: 服务器端:套接字创建函数 socket(),端口绑定函数 bind(),初始化端口通用指针类型 struct sockaddr*,套接口监听函数 listen(),接受连接函数accept(),数据收发函数 read()和 write(),以及套接口关闭函数 close()。客户端:套接口创建函数 socket(),套接口连接函数 connect(),数据收发函数 read()和 write(),以及套接口关闭函数 close()。(2)通信设计首先运行服务器,通过 socket()函数建立一个套接字,利用 sockaddr 保存,然后通过 bind()函数绑定一个网
7、络 IP 和端口,接着调用 listen()是socket 处于被动的监听模式,并且为该 socket 建立一个输入数据队列将到达的服务保存在此队列中,然后响应客户请求,用函数 accept 函数生成一个新的套接口描述符,让服务器接收客户的连接请求,连接成功后使用 read()和write()函数进行客户端之间的交互。通信结束后调用 close()关闭套接字描述符,停止在该 socket 上的任何数据操作。运行客户端程序,利用 socket()函数建立 socket,同时为 socket 数据结构分配存储空间,使用 connect()函数启动与服务器端的连接,连接完成后,使用 write()和
8、 read()与服务器和别的客户端进行通信,通信结束后调用close()关闭套接字描述符,停止在该 socket 上的任何。四、详细设计说明(1)系统调用的相关函数socket()功能:socket 的创建原型:int socket(int domain,int type,int protocol);参数说明:Domain:AF_INET:Ipv4 协议AF_INET:Ipv6 协议type:SOCK_STREAM:字节数据流套接字SOCK_DGRAM:数据报套接字3SOCK_RAW:原始套接字函数返回值:若成功,返回 socket 描述符;若失败,则返回-1bind( )功能:将 socke
9、t 与本机上的一个端口绑定,随后就可以在该端口监听服务请求函数原型int bind(int sockfd,struct sockaddr *addr,int addrlen);参数说明:sockfd:调用 socket 函数返回的 socket 描述符sockaddr:指向包含有本机 IP 地址及端口号等信息的 sockaddr 类型的指针addrlen:指针结构长度 sizeof(struct sockaddr)listen()功能:使 socket 处于被动的监听模式,并为该 socket 建立一个输入队列,将到达的服务请求保存在此队列中,知道程序处理他们函数原型:int listen(i
10、nt sockfd, int backlog);参数说明:sockfd:socket 描述符backlog:最大主机连接数accept()功能:让服务器接收客户的连接请求函数原型:int accept (int sockfd, void *addr, int *addrlen);参数说明:sockfd:被监听的 socket 描述符,存放提出连接请求服务的主机信息addr:指向局部的数据结构 struct sockaddr_in 的指针。addrlen:指向值为 sizeof(struct sockaddr_in)的整型指针变量connect()功能:面向连接的客户程序使用 connect 函
11、数来分配 socket 并与远端服务器建立一个 TCP 连接函数原型:int connect( int sockfd , struct sockaddr *serv_addr , int addrlen);参数说明: sockfd:调用 socket 函数返回的描述符serv-addr:包换远端主机 IP 地址和端口号的指针addrlen:远端地址结构的长度read() 和 write()函数原型 1:ssize_t read (int fd, void *buf,size_t count);功能:发送信息函数原型 2:Ssize_t write (int fd , void *buf,siz
12、e_t count);功能:读取信息close( )4功能:停止在该 socket 上的任何数据操作函数原型:int close(sockfd);参数说明:sockfd:socket 描述符(2)通信连接实现说明监听连接利用 socket()、bind()、listen()函数建立连接,步骤是:1)建立 socketsocket(AF_INT,SOCK_STREAM,0)2)此步骤涉及到 IP 地址及其处理过程。参数说明:int domain 参数 INADDR_ANY 表示 Ipv4 协议bind()将 socket 与本机上的一个端口绑定,随后就可以在该端口监听服务请求函数实现bzero(
13、server_addr.sin_family=AF_INET; /*将地址类型设定好 */server_addr.sin_port=htons(PORT); /* 将端口给其赋值*/inet_pton(AF_INET,IP,/*用连接地址自动填充 ip*/ret=bind(socketfd,(struct sockaddr *)/*socketfd 是分配的 socket 名字,(struct sockaddr *)/1 用户名以存在break;查看当前在线用户在用户信息的结构体中定义用户在线状态标志 client_status,当用户上线时 client_status 改为 1,下线时 cl
14、ient_status 改为 0,把相应的数字转换为字符串发送到客户端,客户端记录相应的标志,传到结构体中。if(Init_Clients(tok_file)=1) /判断用户是否已在线ret = NORMAL_USER_LOGIN_FAILED_ONLINE ;/2 已经在线五、调试与测试(1)实验设备及材料图一:服务器客户端相应流程6局域网环境下,使用一台 Linux 系统 PC 或者连接了老师 linux 系统的远程服务器作为此次实训聊天室的服务器,启动若干的 client 程序作为客户机。(2) 实验步骤1.启动服务器。2.启动客户端,在客户端输入信息进行相应的操作3.观察服务器响应的
15、内容并记录4.客户端进行相关操作服务器响应(3) 实验过程和截图1.启动服务器2.启动客户端3.用户在客户端进行注册4.用户在客户端进行登录75.用户登录之后的功能页面6.同时登录两个用户7.用户进行群聊功能7.显示当前在线用户8.用户下线六、实习日志6 月 19 日8主要任务: 查阅相关资料,明白任务的有关要求,进行需求分析完成情况: 理解并且掌握了相关知识,明白了如何进行客户端与服务器端的交互存在问题: 相关库函数的理解和使用还不彻底,程序设计还没有完善收获: 明白了相关的原理,初步掌握了基与 socket 原理的网络编程,客户端与服务器各自需要完成的功能6 月 20 日 主要任务: 编写
16、服务器端代码完成情况: 完成了基本基于 socket 的服务器框架存在问题: 对于建立相关服务器的代码如何与客户端进行交互掌握还不彻底,和建立服务器的顺序还不是很熟悉收获: 明白了建立服务器的关键代码如何进行合理的运行与组织,在进行测试时候通过增加 printf 语句查看输入输出明白了如何顺利收发信息6 月 21 日 主要任务:编写客户端代码 完成情况:编写完成服务器与客户端的交互以及收发相关的信息 read 与 write函数,在调试完成之后增加相关的功能如时间显示功能存在问题: 把时间添加到如何收发信息的模式下没有完成,准备增加到系统界面中,额外的功能实现,即登录客户端进行相应的功能实行。
17、收获: 建立了基本的网络聊天室框架,可以进行简单的多用户聊天,感觉努力没有白费,终于做出来大致需要实现的功能6 月 22 日 主要任务: 完善客户端和服务器的功能,增加有用的功能完成情况: 增加了用户注册登录系统,在线用户显示功能存在问题: 在实现在线用户的匹配功能时出现匹配出错的情况,显示在线用户时,会出现多个相同的用户同时在线的情况。收获: 额外掌握了本次实习不需要学习的东西,也可能是之前 c 语言函数库使用不熟悉,增加了实习经验6 月 23 日 主要任务:完成 ppt,进行答辩完成情况: 答辩一切顺利,向老师描述了自己实习的过程存在问题: 向老师讲述了自己程序还不完善的地方,有待于改进收获: 提高了自己勇于表达的能力,有问题也可以认真提出来,肯定会有所收获,虽然最终程序可能不是那么完善,但还是很有成就感七、实习总结通过本次课程设计对 Linux 网络聊天室的设计,确实积累和总结了不少的经验,锻炼了我的独立工作和实际动手能力,加深了对计算机网络中 socket 工作原理及其相互联系的认识,提高了对复杂的综合性实践环节具有分析问题、解决问题、概括总结的实际工作能力,对网络编程项目的开发、设计过程有初步认识。经过一周的设计和开发,网络聊天室的设计设计完毕。其功能基本符合用