4.Linux下网络聊天室--概要设计说明书
- 格式:doc
- 大小:54.00 KB
- 文档页数:6
专业方向课程设计任务书(嵌入式方向)题目: 基于linux嵌入式的聊天室系统设计初始条件:1. 软帝嵌入式ARM9开发教学设备;2. PC机及相关应用软件;要求完成的主要任务:1. 了解TCP方面socket编程。
2. 实现客户端与服务器端的聊天功能。
3. 撰写课程设计说明书。
4. 课程设计说明书要求:引言、设计要求、系统结构、原理设计、各个模块的设计与实现、软件设计、调试过程、体会及总结、参考文献、源程序。
说明书使用A4纸打印或手写。
指导教师签名:年月日摘要本系统建立在嵌入式系统网络平台上,系统的设计使用了面向对象技术和面向对象的设计原则。
系统采用C/S与B/S结合的结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。
使用嵌入式C++语言编写,开发工具采用linux下的Qt环境。
服务器设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。
大大增强了程序对服务器资源的利用。
在Linux下编写并调试服务器端程序和客户端程序,实现了客户、服务器之间的连接和通信。
关键字:Linux ;Qt;TCP/IP;多人聊天目录目录............................................................................................................................................. 3第一章总体方案设计 ................................................................................................................. 41.1 系统实现原理 ............................................................................................................ 41.2. 总体方案设计............................................................................................................. 41.2.1 服务器流程图.................................................................................................. 51.2.2 客户端流程图.................................................................................................. 6第二章软件功能实现 ................................................................................................................. 7............................................................................................................................................. 7网络套接字(socket).............................................................................................. 7C/S结构 ........................................................................................ 错误!未定义书签。
linux下聊天室课程设计一、课程目标知识目标:1. 掌握Linux操作系统的基本命令和操作方法;2. 了解网络编程的基本概念,掌握套接字编程的基础知识;3. 学会使用Linux下的C语言编写简单的聊天室程序。
技能目标:1. 能够熟练运用Linux命令行操作,进行基本的文件管理和网络配置;2. 能够运用所学网络编程知识,独立设计并实现一个简单的聊天室程序;3. 提高问题解决能力,能够分析和解决聊天室程序中遇到的问题。
情感态度价值观目标:1. 培养学生对Linux操作系统的兴趣和热情,激发探索操作系统的欲望;2. 培养学生团队协作意识,学会与他人共同解决问题;3. 增强学生的网络安全意识,养成安全使用网络的良好习惯。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程属于信息技术学科,以实践操作为主,理论讲解为辅;2. 学生特点:学生处于高年级阶段,已具备一定的编程基础和计算机操作能力;3. 教学要求:注重理论与实践相结合,培养学生的动手能力和实际操作能力。
二、教学内容1. Linux操作系统基本命令与操作:文件管理、目录操作、文本编辑等;教材章节:第一章 Linux操作系统基础;进度安排:2课时。
2. 网络编程基本概念:TCP/IP协议、套接字编程等;教材章节:第二章 网络编程基础;进度安排:3课时。
3. C语言网络编程:socket函数、bind函数、listen函数、accept函数、send函数、recv函数等;教材章节:第三章 C语言网络编程;进度安排:4课时。
4. 聊天室程序设计:客户端与服务器端程序设计,多线程实现;教材章节:第四章 聊天室程序设计;进度安排:5课时。
5. 聊天室程序调试与优化:程序调试技巧,性能优化方法;教材章节:第五章 聊天室程序调试与优化;进度安排:2课时。
6. 课程总结与拓展:总结所学知识,探讨聊天室程序在实际应用中的改进与拓展;教材章节:第六章 课程总结与拓展;进度安排:1课时。
OCKET网络编程:Linux下实现聊天室SOCKET网络编程:Linux下实现聊天室程序介绍:本聊天室程序在Ubuntu下,采用C语言实现,结构为Client/Server结构;服务端程序通过共享存储区存储聊天数据,并发送给每个连接的客户端;服务端程序和客户端程序都是通过父子进程分别负责发送和接收数据的,以避免数据冲撞;需按以下格式调用客户端程序:client.exe 服务端主机IP 端口号(本程序设定为:3490)用户名(在聊天室中显示的用户名)。
程序截图://--------------------------------服务端----------------------------------------------//--------------------------------客户端1:真水无香--------------------------------------//--------------------------------客户端2:蜡笔小新--------------------------------------程序代码如下://--------------------------------server.c--------------------------------------------------//包含工程所需的头文件#include<stdio.h>#include<stdlib.h>#include<sys/types.h>//数据类型定义#include<sys/stat.h>#include<netinet/in.h>//定义数据结构sockaddr_in#include<sys/socket.h>//提供socket函数及数据结构#include<string.h>#include<unistd.h>#include<signal.h>#include<sys/ipc.h>#include<errno.h>#include<sys/shm.h>#include<time.h>#define PERM S_IRUSR|S_IWUSR#define MYPORT 3490 //宏定义定义通信端口#define BACKLOG 10 //宏定义,定义服务程序可以连接的最大客户数量#define WELCOME "|----------Welcome to the chat room! ----------|"//宏定义,当客户端连接服务端时,想客户发送此欢迎字符串//转换函数,将int类型转换成char *类型void itoa(int i,char*string){int power,j;j=i;for(power=1;j>=10;j/=10)power*=10;for(;power>0;power/=10){*string++='0'+i/power;i%=power;}*string='\0';}//得到当前系统时间void get_cur_time(char * time_str){time_t timep;struct tm *p_curtime;char *time_tmp;time_tmp=(char *)malloc(2);memset(time_tmp,0,2);memset(time_str,0,20);time(&timep);p_curtime = localtime(&timep);strcat(time_str," (");itoa(p_curtime->tm_hour,time_tmp);strcat(time_str,time_tmp);strcat(time_str,":");itoa(p_curtime->tm_min,time_tmp);strcat(time_str,time_tmp);strcat(time_str,":");itoa(p_curtime->tm_sec,time_tmp);strcat(time_str,time_tmp);strcat(time_str,")");free(time_tmp);}//创建共享存储区key_t shm_create(){key_t shmid;//shmid = shmget(IPC_PRIVATE,1024,PERM);if((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1){fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)); exit(1);}return shmid;}//端口绑定函数,创建套接字,并绑定到指定端口int bindPort(unsigned short int port){int sockfd;struct sockaddr_in my_addr;sockfd = socket(AF_INET,SOCK_STREAM,0);//创建基于流套接字my_addr.sin_family = AF_INET;//IPv4协议族my_addr.sin_port = htons(port);//端口转换my_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(my_addr.sin_zero),0);if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){perror("bind");exit(1);}printf("bing success!\n");return sockfd;}int main(int argc, char *argv[]){int sockfd,clientfd,sin_size,recvbytes; //定义监听套接字、客户套接字pid_t pid,ppid; //定义父子线程标记变量char *buf, *r_addr, *w_addr, *temp, *time_str;//="\0"; //定义临时存储区struct sockaddr_in their_addr; //定义地址结构key_t shmid;shmid = shm_create(); //创建共享存储区temp = (char *)malloc(255);time_str=(char *)malloc(20);sockfd = bindPort(MYPORT);//绑定端口while(1){if(listen(sockfd,BACKLOG) == -1)//在指定端口上监听{perror("listen");exit(1);}printf("listening......\n");if((clientfd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)//接收客户端连接{perror("accept");exit(1);}printf("accept from:%d\n",inet_ntoa(their_addr.sin_addr)); send(clientfd,WELCOME,strlen(WELCOME),0);//发送问候信息buf = (char *)malloc(255);ppid = fork();//创建子进程if(ppid == 0){//printf("ppid=0\n");pid = fork(); //创建子进程while(1){if(pid > 0){//父进程用于接收信息memset(buf,0,255);//printf("recv\n");//sleep(1);if((recvbytes = recv(clientfd,buf,255,0)) <= 0){perror("recv1");close(clientfd);raise(SIGKILL);exit(1);}//write buf's data to share memoryw_addr = shmat(shmid, 0, 0);memset(w_addr, '\0', 1024);strncpy(w_addr, buf, 1024);get_cur_time(time_str);strcat(buf,time_str);printf(" %s\n",buf);}else if(pid == 0){//子进程用于发送信息//scanf("%s",buf);sleep(1);r_addr = shmat(shmid, 0, 0);//printf("---%s\n",r_addr);//printf("cmp:%d\n",strcmp(temp,r_addr));if(strcmp(temp,r_addr) != 0){strcpy(temp,r_addr);get_cur_time(time_str);strcat(r_addr,time_str);//printf("discriptor:%d\n",clientfd);//if(send(clientfd,buf,strlen(buf),0) == -1)if(send(clientfd,r_addr,strlen(r_addr),0) == -1){perror("send");}memset(r_addr, '\0', 1024);strcpy(r_addr,temp);}}elseperror("fork");}}}printf("------------------------------\n");free(buf);close(sockfd);close(clientfd);return 0;}//-----------------------------client.c------------------------------------------------- //包含工程所需的头文件#include<stdio.h>#include<netinet/in.h>//定义数据结构sockaddr_in#include<sys/socket.h>//提供socket函数及数据结构#include<sys/types.h>//数据类型定义#include<string.h>#include<stdlib.h>#include<netdb.h>#include<unistd.h>#include<signal.h>#include<time.h>int main(int argc, char *argv[]){struct sockaddr_in clientaddr;//定义地址结构pid_t pid;int clientfd,sendbytes,recvbytes;//定义客户端套接字struct hostent *host;char *buf,*buf_r;if(argc < 4){printf("usage:\n");printf("%s host port name\n",argv[0]);exit(1);}host = gethostbyname(argv[1]);if((clientfd = socket(AF_INET,SOCK_STREAM,0)) == -1) //创建客户端套接字{perror("socket\n");exit(1);}//绑定客户端套接字clientaddr.sin_family = AF_INET;clientaddr.sin_port = htons((uint16_t)atoi(argv[2]));clientaddr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&(clientaddr.sin_zero),0);if(connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(struct sockaddr)) == -1) //连接服务端{perror("connect\n");exit(1);}buf=(char *)malloc(120);memset(buf,0,120);buf_r=(char *)malloc(100);if( recv(clientfd,buf,100,0) == -1){perror("recv:");exit(1);}printf("\n%s\n",buf);pid = fork();//创建子进程while(1){if(pid > 0){//父进程用于发送信息//get_cur_time(time_str);strcpy(buf,argv[3]);strcat(buf,":");memset(buf_r,0,100);//gets(buf_r);fgets(buf_r,100,stdin);strncat(buf,buf_r,strlen(buf_r)-1);//strcat(buf,time_str);//printf("---%s\n",buf);if((sendbytes = send(clientfd,buf,strlen(buf),0)) == -1) {perror("send\n");exit(1);}}else if(pid == 0){//子进程用于接收信息memset(buf,0,100);if(recv(clientfd,buf,100,0) <= 0){perror("recv:");close(clientfd);raise(SIGSTOP);exit(1);}printf("%s\n",buf);}elseperror("fork");}close(clientfd);return 0;}。
江西理工大学应用科学学院嵌入式系统开发技术课程设计专业:电子信息工程班级:092班学号:20号姓名:林洪设计题目:网络聊天程序设计2012年11月课程设计评分表目录1. 系统概述 (2)2. 需求分析 (2)2.1 功能需求 (2)2.2 性能需求 (2)2.3 运行环境要求 (2)3. 系统设计 (3)3.1 系统总体流程图 (3)3.2 系统模块设计 (3)3.2.1 转发信息模块 (3)3.2.2 用户登录模块 (4)3.2.3 群聊模块 (4)3.3 详细设计 (5)3.3.1 登录模块设计 (4)3.3.2 服务器模块 (5)3.3.3 消息格式化模块 (6)3.3.4 群聊模块 (7)4. 调试及测试 (8)4.1 调试结果 (8)4.2 调试结果分析 (10)5. 设计总结 (11)参考文献 (11)附录 (12)1. 系统概述Linux是一种针对PC计算机和工作站得操作系统。
他具有像Windows和Mac那样的功能齐全的图形用户界面。
由于Linux的开源的特点,越来越多的人转而使用Linux 作为PC机得操作系统。
Linux系统支持三种并发方式:多进程、多线程、以及I/O多路复用。
而多线程技术是并行技术中开销较小,效率较高的一种方式,与其他两种方式相比,线程占用更少的系统资源,而且效率更高,是并发技术中最常用的方式。
网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法。
服务器端:循环等候客户连接请求,一旦有客户连接请求,开启一个子线程接受并处理客户请求,接受来自客户的信息。
然后将客户信息反转后再返回给客户端。
主线程继续等待其他客户请求。
服务器具有同时处理多个用户的能力。
客户端:首先与服务器建立连接,然后向服务器发送数据进行交互,接受服务器的反馈信息并显示,之后继续等待用户输入直至用户输入ctrl+D结束通信。
概要设计说明书1引言1.1编写目的全面分析了用户需求,明确了所要开发软件应具有的功能、性能与界面,使软件开发人员能清楚地了解用户的需求,并在此基础上进一步的提出软件概要设计和完成后续的开发设计工作1.2背景说明:a.待开发的软件系统的名称:多线程聊天平台;b.本项目的任务提出者:罗老师开发者:朱军用户:实现该软件的计算中心或计算机网络;c.该软件系统同其他系统或其他机构的基本的相互来往关系:本聊天平台是基于J2ME和/java EE开发、在Windows系统上运行的客户端在线聊天系统,不投入商业使用。
1.3定义列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
1.4参考资料a.概要设计说明书(GB8567——88)b.李刚,疯狂Java讲义(第三版),电子工业出版社2008.9c.李中尉,马文强,陈丹丹,Java从入门到精通。
清华大学出版社,2008,9,12总体设计2.1需求规定客户端需满足下图中的规格:1) 在登录首页,输入账号和密码,点击“登录”按钮,若账号或密码错误,将提示“登录失败,账号、密码错误或注册账号”;若是账号和密码正确,将成功进入聊天室,并显示所有在线用户、群聊内容及私聊内容。
如果用户是第一次登陆的话,那么必须进行注册,填写注册信息和个人资料,否则将无法登陆到我们的聊天室中。
(2) 进入聊天室后,就可以选择相应的聊天对象和聊天方式,字体设置和插入表情;查看在线用户的基本资料;查看个人的基本资料及修改个人的基本资料或是退出聊天室。
详细的说明可参见附录C 。
2.2运行环境操作系统:Windows 7数据库管理系统:mysql5.6开发工具:myeclipse 或者eclipse 开发平台: java详细说明参见附录C 。
2.3基本设计概念和处理流程说明本系统的基本设计概念和处理流程,尽量使用图表的形式。
系统框架图是否退出结束数据流程图2.5功能器求与程序的关系本条用一张如下的矩阵图说明各项功能需求的实现同各块程序的分配关系:3接口设计3.1用户接口本系统采用图形用户接口,以鼠标和键盘为用户接口,方便用户对系统数据的操作。
20XX年复习资料大学复习资料专业:班级:科目老师:日期:[Linux下的网络聊天室]概要设计说明书[V1.0(版本号)]拟制人:梁海宏,李林,王鹏,汤昆桦审核人______________________批准人______________________[二零零九年九月二日]概要设计说明书1.引言1.1编写目的本说明书的编写主要是为了加强对Linux系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作。
1.2背景a.软件名称:Linux下的网络聊天室b.任务提出者:吴工项目开发者:梁海宏,汤昆桦,王鹏,李林项目用户:普通Linux用户2.总体设计2.1需求规定本系统主要功能在于实现多个客户端与服务器端之间的信息传递与文件传输功能2.1.1系统功能系统主要实现4大聊天室功能:1.注册与登录系统2.公聊3.私聊4.文件传输2.3基本设计概念和处理流程一、注册、登陆:——客户端客户端的输入和消息的显示要使用2个终端,一个client,一个是Display。
Client 终端为输入的界面,在这个界面里,新建一个线程来接受服务器端发来的消息,再添加时间信息,并将这些信息写入文件,然后给Display进程发送一个消息,Display 进程接到消息,就去读取文件,并将这些数据显示在Display终端。
打开客户端Display终端界面,用lseek将内部指针指向文件末尾,等待Client 终端里的线程将消息写入文件。
一旦有消息过来,就去文件里读取数据并打印在Display终端。
打开客户端Client终端界面,有3个菜单,一个注册、一个登陆、一个退出。
注册:输入1为注册,客户端提示用户输入/用户名/密码/等信息,使用结构体保存用户输入的信息,将结构体发送给服务器端。
这里,需要使用协议将用户信息封装在结构体里,这个协议为reg,服务器端根据这个协议来执行相应的功能。
等待服务器执行完后,客户端会接收到成功或者失败的信息。
2014届毕业设计说明书基于Linux操作系统的聊天软件的设计学院:电气与信息工程学院学生姓名:指导教师:职称讲师专业:电子信息工程班级:电子1002班完成时间:2014年5月摘要这篇论文整体是在linux下并通过网络实现类似于qq的的一篇操作报告。
开发的框是C/S框架,由server端和client端组成,首先设置好端口参数和ip地址,在编译,调试后实现server端与各个client端的连接,连接后以后server端作为中间端来使客户机实现通讯,因为服务器只存在一个但是客户端存在多个所以我们必须通过链表去管理,client 端的信息发送通过封装在socket结构体中进行传输。
本设计采用TCP/IP协议这样可以保证连接可靠,而且项目管理中釆用linux流行的gcc和makefile编译,大大提高了编译和调试效率,提高了项目完成的效率,但是为了模拟几个client端我们就需要在pc机上再安装一个虚拟系统来操作client端。
本次设计的聊天通信使用全双工,主要实现了功能如:用户的帐号与密码的注册与登录,客户点对点聊天,客户之间的群聊,以及文件的发送与接收。
测试运行后的可靠性满足Linux 网络聊天的基本要求。
关键词:linux, socket, ,server端,client端,网络编程AbstractThis thesis as a whole is under linux platform and through the local area network to achieve similar qq chat. The overall use of C / S framework, the main server -side and client into two parts , set ip and port number , and Linux, compile and debug procedures to achieve client and server connections each client side , and then as the server -side following transfer to achieve communication between client end . Since only one server -side , and you can have multiple client end , so the server side using a single list to manage multiple client side information , client side encapsulated for transmission of information sent through the body in the socket structure . This design uses the TCP / IP protocol ,so you can ensure reliable connection, but also preclude the use of project management in a popular linux gcc and makefile to compile, compile and debug greatly improved efficiency , improve the efficiency of the completion of the project, but due to simulate multiple client end Therefore, in the operating environment need to install a virtual system on the PC to operate multiple client side .The chat tool designed for full-duplex communication using communication , to achieve the five main functions: to-peer chat between new user registration and login, user , group chat among users , file encryption transmission between users. After running the test program to meet the basic needs of network reliability in linux in chat .Keywords : linux, socket,, server -side , client end , network programming目录1 绪论11.1 课题研究的背景及意义11.2 TCP/IP介绍21.3 本文的研究内容42 技术说明与方案选择 52.1通信方式52.1.1 UDP通信52.1.2 TCP通信52.2客户/服务器模型62.3网络套接字(socket)的概念72.4多线程的概念72.5I/O多路复用83 系统实现113.1 Linux提供的有关Socket的系统调用113.2 实验过程说明(使用TCP/IP) 133.3 TCP通信实现144 运行效果29结束语 34致谢35参考文献36附录A 服务器程序 38附录B 客户端程序 471 绪论1.1 课题研究的背景及意义随着计算机应用技术的日益普及,网络也遍及到我们生活的每个角落,很好的利用这一资源,将成为我们工作和学习,带来极大的方便。
姓名:方建学号:109074359班级:网络工程1031背景1.1开发背景在网络无所不在的今天,在Internet上,有ICQ、MSN、Gtalk、OICQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他有号码。
Linux 操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。
但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。
因此制作一个Linux 操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更好的学习网络编程知识和掌握LINUX平台上应用程序设计开发的过程,将大学四年所学知识综合运用,以达到检验学习成果的目的1.2linux介绍Linux是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(GUI,Graphical User Interface)。
Linus Torvald和其它的遍布世界各地的编程人员共同开发的。
作为一种操作系统,它具有与Unix,Mac,Windows和Windows NT同样的功能。
提到Linux我们不能不提GNU和Unix。
Richard M.Stallman建立的自由软件联盟出版了两种许可证,GNU通用公共许可证(GNU Gneral Public License,GPL)和GNU函数库通用公共许可证(GNU Library Gneral Public License,LGPL)。
大部分GNU工程的软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用公共许可证发行的。
操作系统课程设计报告目录一.设计要求和目的 (3)二.背景知识 (4)三.客户端设计 (5)四.客户端主要代码 (6)五.设计体会 (9)摘要随着网络信息时代的来临,Internet人们越来越习惯于在网上获取和交流信息。
据调查显示,80%以上的人上网都会打开聊天工具来聊天,而几乎每一个年轻人都会去聊天。
使用网上聊天已经成为现代年轻人一种新的交往方式。
聊天室更适合于陌生人之自由的聊天世界。
因此我们联系所学的操作系统、数据库和MFC知识决定做一个简易的聊天系统。
一、设计要求和目的此课题是实现一个即时通信系统完成1:进程间通信、并发(同步/互斥)、文件读写2:内存管理、Dll、Windows消息机制、IO。
课题任务分工:客户端子系统:在客户端系统的功能实现上,可以分为以下几个部分:[1]进程信息的输入系统把用户进程要求发送的信息由键盘输入从文件读取。
这部分功能是客户端子系统的基本部分,这个功能是以后各个部分的基础。
系统要求做到即能够从其它子系统中共享一部分信息[2]进程信息的存储:将进程的信息存储到客户端系统中,以及将发送的信息保存在文件中,以备以后进程之间通信确认以及查询。
[3]通信数据的传递及接收:将客户所发送的信息由客户端由网络传到服务器端上,并且接受航服务器返回的接收方发送的信息,然后存储起来。
用户客户端服务器端用户设置连接设置用户发送信息通信内容用户得到的信息处理用户退出服务器日志数据通信信息连接保存保存处理监控二.背景知识 SOCKETSocket 可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket 在应用程序中创建,通过绑定与网络驱动建立关系。
此后,应用程序送给Socket 的数据,由Socket 交网络驱动程序向网络上发送出去。
计算机从网络上收到与该Socket 绑定IP 地址和端口号相关的数据后,由网络驱动程序交给Socket ,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的(1)创建Socket;(2)打开连接到Socket的输入/出流;(3)按照一定的协议对Socket进行读/写操作;(4)关闭Socket.IO技术阻塞模式可能造成阻塞的函数有:connect()、accept()、读写函数C/S两端通过Socket机制进行连接(1) 客户端的编程流程:a创建Socket对象,向Server的监听端口请求;b通过向新Socket中读写数据与Server端通信;c关闭Socket,结束与Server端;(2)服务器端的编程流程:1打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket 服务;2 等待来自客户端的Client端的请求;3接收Client端的请求,用返回的Socket建立连接;4通过向Socket中读写数据来与Client端通信;5关闭Socket,结束与当前Client端的通信;6关闭SerketSocket对象结束监听服务。
[Linux下的网络聊天室] 概要设计说明书
[V1.0(版本号)]
拟制人:梁海宏,李林,王鹏,汤昆桦审核人______________________
批准人______________________
[二零零九年九月二日]
概要设计说明书
1.引言
1.1编写目的
本说明书的编写主要是为了加强对Linux系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作。
1.2背景
a.软件名称:Linux下的网络聊天室
b.任务提出者:吴工
项目开发者:梁海宏,汤昆桦,王鹏,李林
项目用户:普通Linux用户
2.总体设计
2.1需求规定
本系统主要功能在于实现多个客户端与服务器端之间的信息传递与文件传输功能
2.1.1系统功能
系统主要实现4大聊天室功能:
1.注册与登录系统
2.公聊
3.私聊
4.文件传输
2.3基本设计概念和处理流程
一、注册、登陆:
——客户端
客户端的输入和消息的显示要使用2个终端,一个client,一个是Display。
Client终端为输入的界面,在这个界面里,新建一个线程来接受服务器端发来的消息,再添加时间信息,并将这些信息写入文件,然后给Display进程发送一个消息,Display进程接到消息,就去读取文件,并将这些数据显示在Display终端。
打开客户端Display终端界面,用lseek将内部指针指向文件末尾,等待Client终端里的线程将消息写入文件。
一旦有消息过来,就去文件里读取数据并打印在Display终端。
打开客户端Client终端界面,有3个菜单,一个注册、一个登陆、一个退出。
注册:
输入1为注册,客户端提示用户输入/用户名/密码/等信息,使用结构体保存用户输入的信息,将结构体发送给服务器端。
这里,需要使用协议将用户信息封装在结构体里,这个协议为reg,服务器端根据这个协议来执行相应的功能。
等待服务器执行完后,客户端会接收到成功或者失败的信息。
并返回主界面。
结构体的成员变量有4个,一个是协议,一个是客户端的用户名,一个是消息,一个是长度。
消息就是这些信息的组合,用户名和密码的结合,中间使用$来分离。
注册成功,退出程序。
重新打开程序即可登陆。
注册的时候与服务器的交互过程:
请输入你的用户名:
hello
请输入密码:
55555
you pass : 55555
请再次输入密码:
55555
pass you : 55555
正在等待服务器应答...
接到服务器发来的信息:注册成功!
登陆:
输入2为登陆,分别输入用户名和两次输入密码,如果两次密码不同,则需要重新登陆,登陆次数最多为3次,3次输错,则退出程序!输入完毕,又将用户名和密码保存到结构体里,将结构体发到服务器端,等待服务器端的验证。
这里,也需要对用户名和密码信息使用协议来封装成结构体,这个协议为login,服务器端根据这个协议来执行相应的功能。
在Client终端,当登陆成功后,等待用户输入,默认为all,就是给所有人发送消息,使用协议来传送数据,服务器端根据协议来分辨客户端想做什么。
不管做什么事情,都会得到某种成功或者失败的提示信息。
客户端发送给服务器端使用的协议:
1.all$msg,为给所有人发送消息。
2.直接输入view$获得在线用户列表。
3.who$msg,给用户名为“who”的用户发送私聊消息。
4.trans$who$filename将文件传输给who。
5.reg为注册。
6.login为登陆。
登陆的时候与服务器的交互过程:
请输入你的用户名:
helllo
请输入密码:
d
正在等待服务器应答...
接到服务器发来的信息:登录失败!
您还有2次机会,之后将退出程序!
请输入你的用户名:
hello
请输入密码:
55555
正在等待服务器应答...
接到服务器发来的信息:登录成功!
退出:
关闭socket,退出程序。
——服务器端
服务器端建立好socket,等待连接,当有客户端连接服务器的时候,服务器接收连接,并接受客户端发送过来的消息,根据接收到的结构体所携带的协议来做相应的功能。
如果协议为reg,则为客户端注册,首先将发送过来的结构体,提取用户名和密码,然后需要对用户名合法性检验,验证之后如果用户名合法则将用户信息保存到文件中,合法性的规则包括用户名不能重复和不能使用all等协议作为用户名,并且用户名和密码都不能为空。
如果注册成功,服务器端发送一个消息给注册的客户端,同样将消息保存在一个结构体里。
如果失败,也给客户端发送一个消息,您输入的用户名不能为all或者用户名“who”已经存在。
如果协议为login,则将用户名和密码信息提取,再遍历文件里的用户名和密码,直到验证成功为止,如果验证成功则对所有在线的用户发送一条消息:提示某某用户登录成功;如果失败则只给登陆失败的客户端提示登录失败,并给出原因,用户名不存在或者用户名或者密码输入错误。
并跳转到相应的代码执行其他功能,成功则等待发送客户端消息,失败则关闭socket并结束线程。
这里从服务器端发回给客户端的消息使用sprintf到一个字符串来发送。
二、私聊:
——客户端
客户端在登陆成功之后,在发送消息之前可以先查看在线用户列表,查看用户列表使用view$。
接着,可以使用who$msg的形式发送私聊信息,意味着,这个消息是发送给who的。
或者,先使用who$来切换到发送私聊消息,这个时候,你不需要加上协议,即可给who 这个用户发送消息。
这些消息都加上协议who来封装成结构体,再发送给服务器端。
——服务器端
如果是私聊,则根据客户端要发送到哪个用户名的用户,到链表里取得该用户名的客户端信息,服务器再发送给相应的接受信息的客户端。
接受信息的客户终端就会先将信息保存到聊天记录的文件里,并显示接收到的信息,并且信息前面会显示相应的提示符。
样式为:
Fri Sep 4 14:19:53 2009
hello发来私聊消息:nihao
三、公聊:
——客户端
客户端在登陆成功之后,默认就是all协议,可以直接发送公聊信息,不需要加上任何
的协议,实现对所有人的人进行聊天。
命令为all$msg,给所有人发送消息。
或者先使用all$来切换到给所有人发送消息,切换后,不需要加上协议即可发送了。
这些消息都根据协议来封装成结构体,再发送给服务器端。
——服务器端
如果服务器端接收到的发送协议为all,则是公聊,使用for循环来发送给链表里的每个在线用户,每个在线用户的Display终端都会显示该信息。
样式为:
Fri Sep 4 14:19:19 2009
hello发给所有人:nihao,ni shishei
四、文件传输:
——客户端
如果某个客户端想发送文件给其他客户端,则直接使用命令trans$who$filename。
Filename包括本地的路径和文件名。
Trans为协议,就是标志为传输文件。
Who就是发送给谁。
Filename就是要发送的文件在本地的文件名。
——服务器端
当发送到服务器的时候,根据协议,先给接收的客户端发送一条消息为trans标记:某某用户给您发送了**文件,是否接受,Y接受N拒绝接受。
当客户端按下N,则返回一条消息给服务器端,服务器端同时告诉发送的客户端,对方拒绝接受文件。
发送端可以接着继续做其他的事情,私聊或者公聊。
当接收的客户端按下Y,并立即接受保存的路径和文件名。
输入完毕,就可以接受文件了。
客户端返回一条消息给服务器端,服务器端同时返回一条消息给发送的客户端,告诉客户端对方同意接受文件,这时候,文件开始传输,发送完毕后,发送的客户端会显示传输完毕。
我们传输的文件是任意的文件。
不仅仅是文本文件,图片也可以的。
2.4模块结构
2.5功能需求与系统模块的关系。