




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、资料收集于网络,如有侵权请联系网站删除Linux 课程设计网络聊天小组成员介绍:王士俊(客户端程序设计,构建主要思想框架)赵荻 131842223(客户端程序设计,总结报告)林雅洁 131842198(服务端程序设计,查阅资料)张柯 131842222(服务端程序设计,查阅资料)林丽(服务端程序设计,查阅资料)安徽工业大学工商学院word 可编辑资料收集于网络,如有侵权请联系网站删除1. 系统概述网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux 的网络编程的有效方法。本次课题设计是在使用Linux
2、线程和 Socket接口的基础上,编写网络聊天程序,从而掌握 Linux 应用程序开发的基本方法,练习Linux 线程及 Socket 编程的方法,从而将所学知识融会贯通。2. 需求分析2.1 功能需求本次课程设计需要完成以下功能:(1) 实现在服务器的控制下,完成多人聊天,采用单机多终端模拟方式。(2) 在服务器端,使用多线程机制,为多个用户服务。(3) 服务器能够对要求接入的客户端进行身份识别,完成聊天数据的转发,并能够将不同用户聊天记录存档。2.2 性能需求(1) 可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程
3、序,在出现不可知的错误以后,可以尽量安全的退出程序。(2) 模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。(3) 宜操作性,程序简单易懂,容易上手使用。2.3 运行环境要求本项目开发主要完成软件开发可在Linux 平台下开发word 可编辑资料收集于网络,如有侵权请联系网站删除3. 系统设计3.1 系统总体流程图启动客户端登发送信息显示在线入服务器用户启动服务器数据传输等待数据请求数据传输处理用户数据数据传输显示私聊信息显示对所有人信息聊天图 1 系统设计流程图3.2 系统模块设计转发信息模块服务器定义
4、 readMessage函数用于存储要求请求连接的用户名, 客户发送的信息, 该消息服务器、客户端共享,客户端读取该信息,从而实现信息转发。用户登录模块用户输入用户名、服务器 ip 地址及密码,如果通过合法性检测,则可进入聊天主界面与其他人进行聊天。word 可编辑资料收集于网络,如有侵权请联系网站删除群聊模块客户端点击“发送信息”按钮,该客户端的ip 地址、端口号以及信息内容一起打包写入服务器 readMessage函数,客户端通过线程可以读取该客户write 中的内容,从而实现群聊。3.3 详细设计服务器模块word 可编辑资料收集于网络,如有侵权请联系网站删除开始创建套接字Socket否
5、显示用户下线信息套接字绑定到本地端口套接字接听客户端请求否是否有链接请求是返回套接字进行通信保存套接字中的内容IP 链接是否正常是启动转发消息的线程读取套接字中得内容保存所有在线用户名聊天是否启动否是将在线用户名单与“聊天启动”标志 信息写入输出流写入输出流将消息转发给所有在线用户结束图 2 服务器模块流程图word 可编辑资料收集于网络,如有侵权请联系网站删除该服务器界面用于显示用户上线与下线的信息,不可用于聊天,是用于将客户端群聊时发送的信息转发给每一个在线用户,处于一个承接的作用。登录模块设计开始显示客户端主界面连接服务器输入用户名,服务器 IP点击确定是用户名是否为空否是是否为空是IP
6、 是否为空是用户名是否上线否调用群聊函数是是显示群聊信息结束图 3 登录模块流程图word 可编辑资料收集于网络,如有侵权请联系网站删除用户登录需输入相关信息,经过相关的检测后,方可登录。登陆后可查看群聊信息,且可与其他人进行聊天消息格式化模块消息格式化是将用户的对应信息合成固定形式进行传送。开始对应用户传入消息格式化类转发的消息用户名标志消息格式化类将信息整合成固定格式传送“【用户名+:】”转发的消息结束图 4 消息格式化模块流程图word 可编辑资料收集于网络,如有侵权请联系网站删除群聊模块用户登陆以后,可与显示在线的任何用户进行聊天,也可与在线用户一起进行群聊。开始创建套接字写入服务器端
7、口号与IP向服务器发起连接套接字中内容流入对象输出流启动客户端线程读取套接字中的内容检查标志聊天已启动发送消息启动服务器转发的信息在线用户列表添加显示到各用户聊天该用户窗口结束图 5 群聊模块程序流程图word 可编辑资料收集于网络,如有侵权请联系网站删除4. 源代码客户端程序client.c#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#in
8、clude <netinet/in.h>#include <sys/socket.h>#define TRUE 1#define PORT 5000static int sockfd;void recvfromserver()/接受服务器消息线程入口函数 char mes1024; int nbytes=0; while( 1 )memset(mes,0,sizeof(mes); nbytes=read(sockfd,mes,sizeof(mes); if(nbytes>0) mesnbytes='0' printf("%sn"
9、,mes);pthread_exit(NULL);int main(int argc, char *argv)/ int sockfd;char buffer1024;struct sockaddr_in server_addr; struct hostent *host;int portnumber,nbytes; char strhost16;char clientname20;char mes1024;intthr_id;/* thread ID for the newly created thread */pthread_tp_thread;/* thread's struct
10、ure*/if(argc!=1) fprintf(stderr,"Usage:%s an",argv0);exit(1);word 可编辑资料收集于网络,如有侵权请联系网站删除Printf("请输入服务器 ip 地址 n");scanf("%s",strhost);if(host=gethostbyname(strhost)=NULL) fprintf(stderr,"Gethostname errorn"); exit(1);/* 客户程序开始建立sockfd 描述符*/printf ("正在建立套接口
11、 .n"); if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"Socket Error:%san",strerror(errno);exit(1);/* 客户程序填充服务端的资料*/bzero(&server_addr,sizeof(server_addr);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr=*(struct in_addr *)host->h_
12、addr);printf(" 套接口创建成功,正在链接服务器.n");/* 客户程序发起连接请求*/if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,"Connect Error:%san",strerror(errno);exit(1);/* 连接成功了*/Printf ("链接服务器成功 n 欢迎来到聊天室 n"); Printf ("请输入你的用户昵称 n");
13、scanf("%s",clientname);/ write(sockfd,clientname,sizeof(clientname);Printf("nn 开始聊天吧( "Quit" 断开连接) nn");thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL); while(1) memset(buffer,0,sizeof(buffer); memset(mes,0,sizeof(mes); scanf("%s",buffer); s
14、trcat(mes,clientname); strcat(mes,":");strcat(mes,buffer);/ printf("main thread %sn",mes); if(write(sockfd,mes,sizeof(mes)=-1) fprintf(stderr,"Write Error:%sn",strerror(errno); exit(1);if(strcmp(buffer,"Quit")=0) break;/* 结束通讯*/close(sockfd);word 可编辑资料收集于网络,如有
15、侵权请联系网站删除exit(0);服务器程序(server.c)#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define MAXLINE 1000/在一条消息中最大的输出字符数#define LISTENQ 20/最大监听队列
16、#define PORT 5000/ 监听端口#define MAXFD 20/最大的在线用户数量void *get_client(void *);int sockfd,i;static int maxi=0;/maxi 表示当前 client 数组中最大的用户的i 值static int clientMAXFD;void recvandsend(void)/监听转发线程入口函数 int index=0; int nbytes=0; char buffer1024; int len;int outindex=0; while(1)if(maxi>0) memset(buffer,0,si
17、zeof(buffer); nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf("%d,%dn",index,clientindex);if(nbytes>0) buffernbytes='0' printf(" %sn",buffer);outindex=0;while(outindex<maxi)if(write(clientoutindex+,buffer,sizeof(buffer)=-1) fprintf(stderr,&qu
18、ot;Write Error:%sn",strerror(errno); exit(1);word 可编辑资料收集于网络,如有侵权请联系网站删除if(index>=maxi)index=0;pthread_exit(NULL);int main(int argc, char *argv)/ int client_fdLISTENQ,clientnum=0; struct sockaddr_in server_addr; struct sockaddr_in client_addr;int sin_size,portnumber;char hello="Hello! A
19、re You Fine?n"intthr_id;/* thread ID for the newly created thread */pthread_tp_thread;/* thread's structure*/int new_fd=0;memset(client,0,sizeof(client);if(argc!=1) fprintf(stderr,"Usage:%s portnumberan",argv0); exit(1); /* 服务器端开始建立 socket 描述符 */ if(sockfd=socket(AF_INET,SOCK_STRE
20、AM,0)=-1) fprintf(stderr,"Socket error:%sna",strerror(errno); exit(1);/* 服务器端填充sockaddr 结构 */bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);/*捆绑 sockfd 描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struc
21、t sockaddr)=-1) fprintf(stderr,"Bind error:%sna",strerror(errno); exit(1);printf(" 服务器监听端口 %d.n",PORT);/* 监听 sockfd 描述符 */if(listen(sockfd,LISTENQ)=-1) fprintf(stderr,"Listen error:%sna",strerror(errno);exit(1);thr_id = pthread_create(&p_thread, NULL, recvandsend, N
22、ULL); printf(" 欢迎来到本聊天室 n");while(1)word 可编辑资料收集于网络,如有侵权请联系网站删除/* 服务器阻塞 ,直到客户程序建立连接*/if(maxi>=20) printf(" 以达到人数上线 n");continue;sin_size=sizeof(struct sockaddr_in);if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1) fprintf(stderr,"Accept erro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国丁基钠黄药数据监测研究报告
- 教育科技品牌的发展趋势与挑战
- 医疗心理服务的市场需求与发展趋势分析
- 教育4.0以创新引领未来教育模式
- 教育数据与校园安全管理优化
- 公交优先战略2025年城市交通拥堵治理的公共交通与城市社会治理协同报告
- Chloranocryl-Dicryl-生命科学试剂-MCE
- 安徽师范大学《产品摄影》2023-2024学年第一学期期末试卷
- 河南测绘职业学院《医学免疫学研究进展》2023-2024学年第一学期期末试卷
- 天津广播影视职业学院《语文学科课程标准与教材研究》2023-2024学年第一学期期末试卷
- 急救护理培训结业测试题库
- 某镇“十五五”发展规划编制思路
- 2025安全生产月主题宣讲课件十:主要负责人安全公开课
- 加气站气瓶充装质量保证体系手册2024版
- 高一日语开班宣讲课件
- 粮食行业技能竞赛粮油保管员考试试题及答案
- (完整版)BrownBear绘本附配音
- 核心筒超高层单元式幕墙施工组织设计范本
- 丙型肝炎病毒实验活动风险评估报告
- 尾矿库闭库工程施工组织设计方案范本
- 农药助剂分享资料
评论
0/150
提交评论