linux实习_网络实验室_实习论文_第1页
linux实习_网络实验室_实习论文_第2页
linux实习_网络实验室_实习论文_第3页
linux实习_网络实验室_实习论文_第4页
linux实习_网络实验室_实习论文_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题 目: 网络聊天室的设计与实现 学 号姓 名专业班级指导教师实践日期目 录一、综合训练目的与要求1二、综合训练任务1(1)服务器端实现的功能1(2)客户端实现的功能1三、总体设计1(1)系统结构设计1(2)通信设计2四、详细设计说明2(1)系统调用的相关函数2(2)通信连接实现说明3(3)额外功能实现说明4五、调试与测试4六、实习日志6七、实习总结7八、附录:核心代码清单713一、综合训练目的与要求目的:需要提供客户端和服务器,所有用户通过客户端连接服务器进行注册登录后才能进行聊天,进入聊天室有功能选择,用户可以选择群聊功能,或者可以看所有上线用户,或者查看帮助菜单,每次消息发送都带有系统时

2、间要求:任何用户通过客户端注册后登录到服务器进行聊天,服务器需要为守护进程。二、综合训练任务(1)服务器端实现的功能能够正确并且成功开启服务器,服务器为守护进程监听相应的客户端端口,等待客户端用户的连接能建立与客户端用户请求的连接接收客户端发来的注册请求消息,能在服务器端进行注册信息保存接受用户的登录请求信息,能在服务器检验验证用户的登录信息,信息正确的用户可以连接到服务器进行操作,并能够在客户端显示当前的用户上线当用户请求群聊时,服务器可以将客户端发过来的信息传给所有在线用户当用户请求查看当前在线用户时,服务器正确反馈给客户端在线用户客户端请求下线时,提示当前用户下线,服务器将要关闭时提示客

3、户端及时关闭(2)客户端实现的功能能够正确启动成功客户端并发出连接请求能够向服务器发送注册请求,输入用户名和密码保存到服务器能够向服务器发送登录请求,服务器具有验证系统,正确的用户名和密码可以连接服务器,登录聊天室。聊天室,中发送信息,并且所有用户都能收到可以向服务器发出请求群聊的请求,向所有在线用户发送消息可以向服务器发送查看当前在线用户的请求,获得当前在线用户的信息发送消息的实时记录,发送消息可以考到当前系统的时间能够断开与服务器的连接,退出聊天室三、总体设计(1)系统结构设计本系统采用客户/服务器模型,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Cli

4、ent/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户端/服务器模式的TCP/IP。在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递4。所以

5、多个客户端之间的通信就变为了客户端与服务端的通信。本聊天室系统采用了客户端/服务器形式,即客户端向服务器发送连接请求,服务器收到请求后,提供给客户端相应的服务。服务器主要是处理客户输入信息。首先要存储客户的个人资料,相当于注册。再有,在客户聊天时,也要记录下客户的聊天时间,已备查当前时间。当然,服务器还有自己的动态数据处理。客户状态分为在线客户和非在线客户,我采用结构体存储链接客户信息,以链表来记录连接客户。当客户一连接服务器时,就给客户一个ID,也就是相当于注册信息,同时并发服务器一直在为连接用户创建线程。系统的总体设计是服务器端和客户端,组成如下: 服务器端:套接字创建函数socket()

6、,端口绑定函数bind(),初始化端口通用指针类型struct sockaddr*,套接口监听函数listen(),接受连接函数accept(),数据收发函数read()和write(),以及套接口关闭函数close()。客户端:套接口创建函数socket(),套接口连接函数connect(),数据收发函数read()和write(),以及套接口关闭函数close()。(2)通信设计首先运行服务器,通过socket()函数建立一个套接字,利用sockaddr保存,然后通过bind()函数绑定一个网络IP和端口,接着调用listen()是socket处于被动的监听模式,并且为该socket建立一

7、个输入数据队列将到达的服务保存在此队列中,然后响应客户请求,用函数accept函数生成一个新的套接口描述符,让服务器接收客户的连接请求,连接成功后使用read()和write()函数进行客户端之间的交互。通信结束后调用close()关闭套接字描述符,停止在该socket上的任何数据操作。运行客户端程序,利用socket()函数建立socket,同时为socket数据结构分配存储空间,使用connect()函数启动与服务器端的连接,连接完成后,使用write()和read()与服务器和别的客户端进行通信,通信结束后调用close()关闭套接字描述符,停止在该socket上的任何。四、详细设计说明

8、(1)系统调用的相关函数socket()功能:socket的创建原型:int socket(int domain,int type,int protocol);参数说明:Domain:AF_INET:Ipv4协议 AF_INET:Ipv6协议type:SOCK_STREAM:字节数据流套接字 SOCK_DGRAM:数据报套接字 SOCK_RAW:原始套接字函数返回值:若成功,返回socket描述符;若失败,则返回-1bind( )功能:将socket与本机上的一个端口绑定,随后就可以在该端口监听服务请求函数原型int bind(int sockfd,struct sockaddr *addr,

9、int addrlen);参数说明:sockfd:调用socket函数返回的socket描述符sockaddr:指向包含有本机IP地址及端口号等信息的sockaddr类型的指针addrlen:指针结构长度sizeof(struct sockaddr)listen()功能:使socket处于被动的监听模式,并为该socket建立一个输入队列,将到达的服务请求保存在此队列中,知道程序处理他们函数原型:int listen(int sockfd, int backlog);参数说明:sockfd:socket描述符backlog:最大主机连接数accept()功能:让服务器接收客户的连接请求函数原型

10、:int accept (int sockfd, void *addr, int *addrlen);参数说明:sockfd:被监听的socket描述符,存放提出连接请求服务的主机信息addr:指向局部的数据结构struct sockaddr_in的指针。addrlen:指向值为 sizeof(struct sockaddr_in)的整型指针变量connect()功能:面向连接的客户程序使用connect函数来分配socket并与远端服务器建立一个TCP连接函数原型:int connect( int sockfd , struct sockaddr *serv_addr , int addrl

11、en);参数说明: 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,size_t count);功能:读取信息close( )功能:停止在该socket上的任何数据操作函数原型:int close(sockfd);参数说明:sockfd:socket描述符(2)通信连接实现说明监听连

12、接 利用socket()、bind()、listen()函数建立连接,步骤是:1)建立socketsocket(AF_INT,SOCK_STREAM,0)2)此步骤涉及到IP地址及其处理过程。参数说明:int domain 参数 INADDR_ANY表示Ipv4协议bind()将socket与本机上的一个端口绑定,随后就可以在该端口监听服务请求函数实现bzero(&server_addr,sizeof(server_addr);server_addr.sin_family=AF_INET; /*将地址类型设定好 */server_addr.sin_port=htons(PORT); /

13、* 将端口给其赋值*/inet_pton(AF_INET,IP,&server_addr.sin_addr);/*用连接地址自动填充ip*/ret=bind(socketfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr);/*socketfd 是分配的socket名字,(struct sockaddr *)&server_addr则便是分配好的端口与IP,用bind绑定*/利用listen监听请求 发送请求1)初始化socket端口。2)利用connect函数将自己的IP地址等信息发送到服务器,等待主机调

14、用accept函数来接受请求。服务器接收请求,进行数据通信1)服务器利用accept接收请求。2)创建子进程,关闭父进程(守护进程);3)接收返回信息,显示连接成功,并推出功能连接;4)关闭客户端口socket;5)关闭服务端socket,结束子线程。图一:服务器客户端相应流程(3)额外功能实现说明用户用户注册和登录功能利用read函数和write函数从客户端读取用户的用户名和密码发送到服务器的数据库(文件)中,进行用户信息的创建,然后客户端登录输入响应的用户名和密码,服务器通过write函数接收,并且通过strcmp()函数进行响应的匹配,可以达到用户信息的匹配功能if(strcmp(tok

15、_file0,send->name)=0)flag=REGIST_EXITED;/1用户名以存在break;查看当前在线用户在用户信息的结构体中定义用户在线状态标志client_status,当用户上线时client_status改为1,下线时client_status改为0,把相应的数字转换为字符串发送到客户端,客户端记录相应的标志,传到结构体中。if(Init_Clients(tok_file)=1) /判断用户是否已在线 ret = NORMAL_USER_LOGIN_FAILED_ONLINE ;/2 已经在线五、调试与测试(1)实验设备及材料局域网环境下,使用一台Linux系统

16、PC或者连接了老师linux系统的远程服务器作为此次实训聊天室的服务器,启动若干的client程序作为客户机。(2) 实验步骤1.启动服务器。2.启动客户端,在客户端输入信息进行相应的操作3.观察服务器响应的内容并记录4.客户端进行相关操作服务器响应(3) 实验过程和截图1.启动服务器2.启动客户端3.用户在客户端进行注册4.用户在客户端进行登录5.用户登录之后的功能页面6.同时登录两个用户7.用户进行群聊功能7.显示当前在线用户8.用户下线六、实习日志6月19日主要任务: 查阅相关资料,明白任务的有关要求,进行需求分析完成情况: 理解并且掌握了相关知识,明白了如何进行客户端与服务器端的交互存

17、在问题: 相关库函数的理解和使用还不彻底,程序设计还没有完善收获: 明白了相关的原理,初步掌握了基与socket原理的网络编程,客户端与服务器各自需要完成的功能6月20日 主要任务: 编写服务器端代码完成情况: 完成了基本基于socket的服务器框架存在问题: 对于建立相关服务器的代码如何与客户端进行交互掌握还不彻底,和建立服务器的顺序还不是很熟悉收获: 明白了建立服务器的关键代码如何进行合理的运行与组织,在进行测试时候通过增加printf语句查看输入输出明白了如何顺利收发信息6月21日 主要任务:编写客户端代码 完成情况:编写完成服务器与客户端的交互以及收发相关的信息read与write函数

18、,在调试完成之后增加相关的功能如时间显示功能存在问题: 把时间添加到如何收发信息的模式下没有完成,准备增加到系统界面中,额外的功能实现,即登录客户端进行相应的功能实行。收获: 建立了基本的网络聊天室框架,可以进行简单的多用户聊天,感觉努力没有白费,终于做出来大致需要实现的功能6月22日 主要任务: 完善客户端和服务器的功能,增加有用的功能完成情况: 增加了用户注册登录系统,在线用户显示功能存在问题: 在实现在线用户的匹配功能时出现匹配出错的情况,显示在线用户时,会出现多个相同的用户同时在线的情况。收获: 额外掌握了本次实习不需要学习的东西,也可能是之前c语言函数库使用不熟悉,增加了实习经验6月

19、23日 主要任务:完成ppt,进行答辩完成情况: 答辩一切顺利,向老师描述了自己实习的过程存在问题: 向老师讲述了自己程序还不完善的地方,有待于改进收获: 提高了自己勇于表达的能力,有问题也可以认真提出来,肯定会有所收获,虽然最终程序可能不是那么完善,但还是很有成就感七、实习总结通过本次课程设计对Linux网络聊天室的设计,确实积累和总结了不少的经验,锻炼了我的独立工作和实际动手能力,加深了对计算机网络中socket工作原理及其相互联系的认识,提高了对复杂的综合性实践环节具有分析问题、解决问题、概括总结的实际工作能力,对网络编程项目的开发、设计过程有初步认识。经过一周的设计和开发,网络聊天室的

20、设计设计完毕。其功能基本符合用户需求,能够简单的网络聊天功能。但是由于课程设计时间较短,还有许多不尽如人意的地方,还有待于我们进一步完善其功能。还增加了本来没有的功能,而且成功实现。学linux操作系统让我收获颇丰,同时也让我发现了自身的不足。在实验课上学到的,我将发挥到其它中去,也将在今后的学习和工作中不断提高、完善;在此间发现的不足,我将努力改善,通过学习、实践等方式不断提高,克服那些不应成为学习、获得知识的障碍。在今后的学习、工作中有更大的收获,在不断的探索中、在无私的学习、奉献中实现自己的人生价值。八、附录:核心代码清单服务器端:/=初始化系统连接=/int System_init()

21、 int ret; int socketfd; struct sockaddr_in server_addr ; if(socketfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror("socket errorn"); exit(1); /int opt,optlen=sizeof(optlen); /if(setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&opt,optlen)=-1) /printf("server setsockopt() error"); bzer

22、o(&server_addr,sizeof(server_addr); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT); inet_pton(AF_INET,IP,&server_addr.sin_addr); ret=bind(socketfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr); if(ret<0) perror("bind error"); exit(1); if( (listen(

23、socketfd,QUEUELEN)=-1) perror("listen error"); exit(1); else printf("waiting client connection.n"); sleep(1); printf(".n"); printf("连接成功"); return socketfd ;/=等待客户端连接=/void Connect_To_client(int socketfd ) int newfd; struct sockaddr_in caddr; socklen_t len=siz

24、eof(struct sockaddr_in);/用来返回参数二caddr的大小 int ret,i=0; while(1) if(newfd=accept(socketfd,(struct sockaddr *)&caddr,&len)<0) perror("listen errorn"); exit(1); printf("$%s请求连接.n",inet_ntoa(caddr.sin_addr); for(i=0; i<QUEUELEN; i+) if(clientsi.sockfd=0) clientsi.sockfd=

25、newfd; printf("clients%dsockfd=%dn",i,clientsi.sockfd); break; ret=pthread_create(&clientsi.tid,NULL,pthreads,&clientsi.sockfd); if(ret<0) perror("listen errorn"); exit(1); close(socketfd); close(newfd);/=线程读函数=/void *pthreads(void *argc) int newfd=*(int *)argc); /char

26、 bufBUFSIZE=0; send_info send,*p; p=&send; while(1) read(newfd,&send,sizeof(send); Parse_Buf(p,newfd);/解析客户端传过来的字符串数据结构中的type 成员来匹配调用不同的函数。 memset(&send,0,sizeof(send); Client_Exit(p,newfd);/=解析函数type标志,进入相应功能=/void Parse_Buf(send_info *send,int newfd) int i=0; for(i=0; i<pi.fun_flag;

27、 i+) /在功能函数数组里查找相应flag if(send->type=pi.fun_flag) pi.fun(send,newfd); break; 客户端:/*链接初始化*/void inits() struct sockaddr_in server; if(socketfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror("creat socket errorn"); exit(1); bzero(&server, sizeof(server); /memset(&server,0,sizeof(server)

28、; / bzero(&(server.sin_zero),8); server.sin_family=AF_INET; server.sin_port=htons(PORT); inet_pton(AF_INET,IP,&server.sin_addr); if( connect(socketfd,(struct sockaddr *)&server,sizeof(struct sockaddr)=-1) perror("connect errorn"); exit(1); reg_log(); / login or register pthread_t tid;/线程标识符 pthread_t if(pthread_create(&tid,NULL,pthread_fun,&socketfd)=-1) /*int pthread_create (pthread_t * thread_id,_const pthread_attr_t * _attr, void *(*_start_routine) (void *), void *_restrict

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论