您好,欢迎访问三七文档
Linux网络应用开发技术课程考核报告基于TCP的多线程QQ聊天室学号:1515925610姓名:李明慧专业:软件工程专业班级:15级云计算1班指导教师:郭俊颖南阳理工学院软件学院2016年12月目录1.设计思想-------------------------------------------------------------------32流程图---------------------------------------------------------------------33运行步骤-------------------------------------------------------------------43.1服务器---------------------------------------------------------------43.2客户端----------------------------------------------------------------44.运行结果截图----------------------------------------------------------------44.1群聊实现过程----------------------------------------------------------54.2私聊实现过程----------------------------------------------------------65.个人总结-------------------------------------------------------------------76.附录代码--------------------------------------------------------------------7一.设计思想创建服务器端的通信套接字,进行对于客户端的监听;定义一个全局数组变量intuser_fd[M],用来保存已经连接的客户端的通信套接字。当客户端选择群聊的时候服务器会把接收到的信息发送给其他所有客户端;用户选择私聊时则通过判断客户端套接字描述符,把此消息发送给指定的客户端!利用套接字不仅进行信息的传递,同时也是服务器端对发消息的不同客户端识别的依据,进而实现客户端与客户端之间的通信的私聊模式。服务器相当于一个对于客户端发送的信息进行转发的平台,当客户端的信息发送过来后,服务器会自动通过套接字将信息再全部转发给其他的客户,从而实现群聊。二.流程图向服务器发送连接请求否否是是服务器客户端socket()bind()listen()是否有客户端连接?accept()输出错误信息socket()connect()是否连接成功?客户端异常退出输入发送的消息开始否是私聊群聊三.运行步骤1.在服务器开启监听服务之后,启用客户端段进行连接.启用一个服务器程序编译:gccserver.c–lpthread–oserver运行:./server2.启用一个或多个客户端程序编译:gccclient.c–lpthread–oclient运行:./client在客户端中输入要发送的消息及要发送的客户端或者群聊模式进而实现群聊或者私聊四.运行结果截图1.群聊:是否是群聊请求?接收客户端发送的消息recv(),并将接收到的信息发送给各个客户端send()接收某个客户端消息recv(),并将消息私发给指定的客户端send()输入发送选项发送消息至指定的客户端发送给其他所有的客户端结束图1-1服务器(群聊)图1-2客户端4图1-3客户端5图1-4客户端62.私聊图2-1服务器(私聊)图2-2客户端4图2-3客户端5五.个人总结通过本次课程设计对Linux网络聊天室的设计,确实积累和总结了不少的经验,不仅加深了对计算机网络中socket工作原理及其相互联系的认识,提高了对复杂的综合性实践环节具有分析问题、解决问题、概括总结的实际工作能力,对网络编程项目的开发、设计过程也有初步认识。经过近了一周的设计和实现,其功能基本符合用户需求,虽然中途不知道如何解决公聊和私聊的问题,但是通过查找资料,询问同学,不断地修改代码,最终才能有网络聊天的功能。在本次课题程序设计中,我觉得对我前边学的内容相当于做了检测与回顾,感觉受益匪浅,今后一定多加实践练习,不断地提高自己linux网络编程能力。六.附录服务器代码://server.c#includestdio.h#includearpa/inet.h#includestring.h#includestrings.h#includestdlib.h#includeunistd.h#includepthread.h#includetime.h#includectype.h#includesys/socket.h#includesignal.h#definePORT8889#defineM10intuser_fd[M];structclient{charmessage[100];ints;};intserver_fd;voidinit(){inti;structsockaddr_inserver_addr;if((server_fd=socket(AF_INET,SOCK_STREAM,0))==-1){perror(socketerror\n);exit(1);}bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=inet_addr(127.0.0.1);if(bind(server_fd,(structsockaddr*)&server_addr,sizeof(server_addr))0){perror(binderror!\n);exit(1);}if(listen(server_fd,M)==-1){perror(listenerror!\n);exit(1);}printf(listening...........\n);}void*recv_fun(void*arg){inti;intfd=*((int*)arg);structclientbuf;while(1){if((recv(fd,(char*)&buf,sizeof(buf),0))0){printf(receivefail!\n);exit(1);}for(i=0;iM;i++){if(fd==user_fd[i]){break;}}printf(客户端%d---的消息:%s\n,fd,buf.message);if(buf.s==-1){buf.s=fd;for(i=0;iM;i++){if((user_fd[i]!=fd)&&(user_fd[i]!=-1)){send(user_fd[i],(char*)&buf,sizeof(buf),0);}}}else{send(buf.s,(char*)&buf,sizeof(buf),0);}}}voidstart(){inti;structsockaddr_inclient_addr;pthread_tpid;intlen=sizeof(structsockaddr_in);init();for(i=0;iM;i++){user_fd[i]=-1;}i=1;while(1){if((user_fd[i]=accept(server_fd,(structsockaddr*)&client_addr,&len))==-1){perror(accpeterror!\n);break;}printf(客户端%d已连接!\n,user_fd[i]);pthread_create(&pid,NULL,recv_fun,(void*)&user_fd[i]);i++;}}voidsig_close(){close(server_fd);exit(0);}intmain(){signal(SIGINT,sig_close);start();return0;}客户端代码://client.c#includestdio.h#includestdlib.h#includesys/socket.h#includearpa/inet.h#includeunistd.h#includestring.h#includestrings.h#includepthread.h#includenetinet/in.h#includesys/types.h#includeerrno.h#includenetdb.h#includesignal.h#definePORT8889#defineMAX_SIZE100intsock_fd;structclient{charmessage[100];intn;}um;voidmenu(){printf(**********************************\n);printf(*********私聊输入客户端的编号*********\n);printf(*********群聊输入-1****************\n);printf(**********************************\n);}voidshow_system_time(){time_ttimep;structtm*p_curtime;char*time_tmp;time_tmp=(char*)malloc(2);memset(time_tmp,0,2);time(&timep);p_curtime=localtime(&timep);printf((%d:%d:%d)\n,p_curtime-tm_hour,p_curtime-tm_min,p_curtime-tm_sec);}void*send_fun(void*arg){intsfd=*((int*)arg);while(1){printf(请输入要发送的信息:\n);bzero(um.message,100);scanf(%s,um.message);printf(发送选项:);scanf(%d,&um.n);if(um.n!=-1){strcat(um.message,(私聊模式));}if((send(sfd,(char*)&um,sizeof(um),0))==-1){printf(senderroe!\n);}}}void*recv_fun(void*arg){intfd;while(1){intsfd=*(int*)arg;intlength;while(length=recv(sfd,(char*)&um,sizeof(um),0)){printf(\n收到来自客户端%d的消息:%s,um.n,um.message);show_system_time();}}}voidsig_close(){close(sock_fd);exit(0);}intmain(){charstr[1000];structsockaddr_insock_addr;signal(SIGINT,sig_close);if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){perror(socketerror!\n);}bzero(&sock_addr,sizeof(sock_addr));sock_addr.sin_family=AF_INET;sock_addr.sin_port=htons(PORT);inet_pton(AF_INET,127.0.0.1,&sock_ad
本文标题:linux课程设计
链接地址:https://www.777doc.com/doc-4210853 .html