linux聊天室报告.doc_第1页
linux聊天室报告.doc_第2页
linux聊天室报告.doc_第3页
linux聊天室报告.doc_第4页
linux聊天室报告.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

Linux程序设计期末大作业报告 信息工程与自动化学院 专 业: 计算机科学与技术 年 级: 2009级 学 生 姓 名: 徐兴繁 学 生 学 号: 200910405214 任 课 教师姓名: 李英娜 任 课 教师职称:讲 师 摘要:shell是一种具备特殊特殊功能的程序,它是介于使用者和UNIX、/linux操作系统之核心程序间的一个接口。本设计主要实现一个Linux下的局域网聊天工具的设计。该设计主要分为两部分,客户端部分和服务器部分。设计并实现一个简单的聊天室程序,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。据此,聊天程序分为客户端和服务器端。客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。两个部分都使用C语言,利用vi编辑器,通过Berkeley套接口编程实现相关功能。关键词:linux,shell编程,聊天室,客户端,服务器,套接字。目录1、期末大作业的目的22、大作业的基本要求33、设计内容33、1 shell编程(20分)33.1.1字符串的判断33.1.2月份的截取转换43、2 聊天室编程(50分)53.2.1需要实现的主要功能63.2.2 客户端功能模块63.2.3 服务器功能模块73.2.4代码实现:73.2.4设计结果截图:144、小结:175、参考文献171、期末大作业的目的Linux程序设计大作业是在完成理论课程学习之后,通过大作业的方式对学生进行综合实践考核,在学生掌握Linux的基本编程知识及常用的操作命令基础上,提高学生对所学知识的应用能力,特别是:煅炼学生搜集有关Linux资料,在资料文档的帮助下,运用Linux的基本知识及常用的操作命令来解决问题的能力。2、大作业的基本要求要求能完成给定的编程任务,并写出相应的大作业总结报告2.1、根据合理的进度安排,按照程序的流程及方法,踏实地完成期末大作业的任务安排。 2.2、按照任务要求,完成各个功能模块的功能划分和程序编写,调试代码并运行。 2.3、按要求撰写大作业报告。3、设计内容3、1 shell编程(20分)要求:写出2个Shell程序,每个不少于15行(如实现自己模拟shell下的cd、ls指令等),说明程序主要功能,每行给出注释;3.1.1 字符串的判断写一个脚本,检测用户输入串的合法性, 要求串由大小写字母、数字组成,无标点、特殊符号、空格。思路:将输入的串中 非字母数字的内容删除或替换为空后若和原来输入的相同则合法,否则不合法。#!/bin/bashisvalidAlphaNum()compressed=$(echo $1 | sed s/:alnum:/g) #替换不合要求字符为空if $compressed != $1 ; thenreturn 1# not valideelsereturn 0 # validefi#函数体,判断字串的合法性echo -n Enter input:# -n 强制不换行read input#读取内容存到input中, 无 $ 符号if ! isvalidAlphaNum &input ;then #加引号,否则可能会出错。echo invalideexit 1elseecho validefiexit 0运行截图:3.1.2 月份的截取转换输入一个 “month day year”格式的日期串,程序将处理” month”为 其英文单词的前三个字母,第一个字母大写,其余的小写。思路:首先判断month是数字、还是单词,若是数字,则可查“数字month”映射表(自定义case结构);若是单词,则取前三个字母,并格式化。#!/bin/bashmonthnoToName() case $1 in 1 ) month=Jan ; 2 ) month=Feb ; 3 ) month=Mar ; 4 ) month=Apr ; 5 ) month=May ; 6 ) month=Jun ; 7 ) month=Jul ; 8 ) month=Aug ; 9 ) month=Sep ; 10) month=Oct ; 11) month=Nov ; 12) month=Dec ; * ) echo $0: Unknown numeric month value $1 &2; exit 1 # default, esac# return 0if $# -ne 3 ; then #若参数个数不为3,则有误echo “Usage: $0 month day year”exit 1fi#判断参数1是数字还是单词,方法 替换串中所有数字,若结果为空,则为数字,否则为单词。if -n $(echo $1 | sed s/:digit:/g) # -n 检测串是为空thenmonthnoToName $1# 数字else# 取第一个字母并将其变为大写,再将结果与取出的第二三字母组合month=”$(echo $1 | cut c1 | tr :lower: :upper:)“month=”$month$(echo $1 | cut -c2-3 | tr :upper: :lower:)”fiecho $month $2 $3 # 输出结果exit 0运行截图:3、2 聊天室编程(50分)设计并实现一个简单的聊天室程序,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。据此,聊天程序分为客户端和服务器端。客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。3.2.1需要实现的主要功能(1)客户端输入服务器IP和端口号(2)服务器成功启动(3)每个客户端可以找到服务器,并可以与服务器进行连接(4)客户端与服务器可以实现通讯3.2.2 客户端功能模块(1)连接服务器连接服务器之前需要解析服务器地址,创建套接字,设置相关参数。(2)发送消息功能3.2.3 服务器功能模块3.2.4代码实现:(1)客户端代码#include #include #include #include #include #include #include #include #define TRUE 1#define PORT 1000 static int sockfd;void recvfromserver() /接受服务器消息线程入口函数char mes1024;int nbytes=0;while(1)memset(mes,0,sizeof(mes);nbytes=read(sockfd,mes,sizeof(mes);if(nbytes0)mesnbytes=0;printf(%sn,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 *strhost=127.0.0.1;char clientname20;char password20;char mes1024;int thr_id; /* thread ID for the newly created thread */pthread_t p_thread; /* threads structure */if(argc!=1)fprintf(stderr,Usage:%s an,argv0);exit(1);if(host=gethostbyname(strhost)=NULL)fprintf(stderr,Gethostname errorn);exit(1);/* 客户程序开始建立 sockfd 描述符 */printf(正在建立套接口.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_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);scanf(%s,clientname);printf(请输入登录密码:n);scanf(%s,password); printf(n登陆成功);/write(sockfd,clientname,sizeof(clientname);printf(n开始聊天(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);strcat(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);exit(0);(2)服务器代码#include #include #include #include #include #include #include #include #define MAXLINE 1000 /在一条消息中最大的输出字符数#define LISTENQ 20 /最大监听队列#define PORT 1000 /监听端口#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(maxi0)memset(buffer,0,sizeof(buffer);nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf(%d,%dn,index,clientindex);if(nbytes0)buffernbytes=0;printf( %sn,buffer);outindex=0;while(outindex=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! Are You Fine?n;int thr_id; /* thread ID for the newly created thread */pthread_t p_thread; /* threads 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_STREAM,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_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(PORT);/* 捆绑 sockfd 描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct 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, NULL);printf(欢迎来到聊天室!n);while(1)/* 服务器阻塞,直到客户程序建立连接 */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 error:%sna,strerror(errno);exit(1);/*fprintf(stderr,Server get connection from %sn,inet_ntoa(client_addr.sin_addr);*/clientmaxi+=new_fd;printf(n新用

温馨提示

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

评论

0/150

提交评论