第一篇:基于linux网络聊天室的设计
《Linux操作系统》课程设计报告
学 院 工商学院
专 业 计算机科学与技术 班 级 计1341 学生姓名:王慢,韩霞,孙洁茹,李强,蒋涛
课程设计任务书
题 目
基于linux网络聊天室的设计
实验目的:
《Linux操作系统课程设计B》是一门在课程《Linux操作系统与程序设计B》后独立开设的实验课程。这一门实验课程的开设目的是为了通过学生独立完成一个基于Linux平台的较大型应用程序,巩固课堂上学到的Linux平台上的编程规范、技术和技巧,培养学生的编写较大型程序的能力和提高学生综合应用素质。
本课程设计实验主要围绕Linux平台上主流的基础技术展开,这些技术包括:Linux的进程、线程通信和同步技术; socket网络通信技术等,这些技术可以集中体现并应用在并发程序设计中。通过并发程序的设计与开发,培养学生底层软件开发的能力,并为将来从事UNIX/Linux平台开发、嵌入式开发等相对高端的软件开发工作打下基础。
课程设计的具体内容与要求:
1.阅读(一个)示例代码,理解并发程序设计并掌握基于Linux平台并发程序设计的方法。
2.在充分理解示例程序的基础上,重新定义和完善程序的功能,定义数据结构,划分程序的功能模块和接口,明确每个模块功能以及相互关系。
3.完成程序的详细设计和编码,并测试。
4.书写并提交文档
目录
1引言.................................................................................1
1.1课程设计背景...................................................................1 1.2课程设计目的...................................................................2 1.3课程设计内容...................................................................4 2 技术介绍............................................................................7 2.1TCP和UDP介绍...................................................................2.2客户/服务器模型.................................................................2.3网络套接字(socket)的概念......................................................2.4多线程的概念....................................................................3 系统设计...........................................................................10 3.1 系统结构设计...................................................................3.2通信模块设计....................................................................4模块实现............................................................................12 4.1系统调用相关函数................................................................4.2 系统实现过程说明...............................................................5 运行效果..........................................................................15 结束语.................................................................................参考文献.............................................................................18 附录..............................................................................19-24
基于linux网络聊天室的设计
摘 要 本课程设计主要实现一个Linux下的局域网聊天工具的设计。该设计主要分为两部分,客户端部分和主机部分。运行服务器端程序可以和任意运行了客户端程序的主机进行通信,通信内容能够通过终端显示出来。两个部分都使用C语言,利用vi编辑器,通过Berkeley套接口编程实现相关功能。引 言
1.1课程设计背景
Linux是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(GUI,Graphical User Interface)。Linus Torvald和其它的遍布世界各地的编程人员共同开发的[1]。
提到Linux我们不能不提GNU和Unix。Richard M.Stallman建立的自由软件联盟出版了两种许可证,GNU通用公共许可证(GNU Gneral Public License,GPL)和GNU函数库通用公共许可证(GNU Library Gneral Public License,LGPL)。大部分GNU工程的软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用公共许可证发行的。按照GNU通用公共许可证的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈愿望。GPL充分体现了Stallman的思想:只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至发布这个软件。通过这种方式,GPL保证了Linux(以及同一许可证下的大量其他软件)不仅现在自由可用,而且皮后经过任何修改这后都仍然可以自由使用。
Unix是由AT—T贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弃了的PDP-7上开发的;最初它是一个用汇编语言写成的单用户操作系统。后来,他们又在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此),把Unix做成为了一个文本处理系统,这使Unix在贝尔实验室得到广泛的应用。Unix的最初版本免费提供给许多知名的大学的计算机系使用。加州大学伯克利分校的计算机系就是其中的一名,并地Unix进行了修改增加了许多新的特点,这就是主为人知的BSC版本的Unix。与此同时,其它独立开发的Unix版本也开始萌生。Unix不断发展了,各种版本被应用到不同的计算机使
用。而Linux最初是专门为基于Intel的个人计算机设计的。(1)Linux的昨天
1991年,一名叫Linus Torvalds的芬兰大学生对Unix各种版本对于80386类的机器的脆弱支持十分不满,他决定要开发出一个全功能的、支持POSIX标准的、类Unix的操作系统内核,该系统吸收了BSD和System V 的优点,同进摒弃了它们的缺点。他独立把这个内核开发到0.02版,这个版本已经可以运行gcc、bash和很少的一些应用程序。后来,他又开始了在因特网上寻求广泛的帮助。1994年,Linux已经升级到1.0版本。它的源代码量也呈指数形式增长,实现了基本的TCP/IP功能,此时Linux已经拥有大约10万的用户。(2)Linux的今天
作为一各服务器级的操作系统,Linux已经成熟了。现在的Linux内核由150多行代码组成,能作为Web服务器平台,也为越来越多的商业用户提供文件和打印服务。它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。
Linux的企业级特性,比如支持多处理器、支持大型文件系统、日志文件系统以及密集型计算和高可用性集群技术,也逐步成熟。
桌面上的Linux也在继续完善。KDE桌面提供的图形用户界面在易用性和可配置方面都能和微软的Windows相媲美。(3)Linux的明天
Linux最强大的生命力在于其公开的开发过程。每个人都有可以自由获取内核源程序,每个人都有要不得以运载源程序加以修改,而后他人也可以自由获取你修改后的源程序。Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型)。Bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。本联盟就是想通过bazaar开发模型,在网上召集一些Linux的爱好者,开发出更优秀的操作系统或软件。
1.2课程设计目的
本课程设计主要实现一个Linux下的局域网聊天工具的设计。该设计主要分为两部分,客户端部分和主机部分。运行服务器端程序可以和任意运行了客户端程序的主机进行通信,通信内容能够通过终端显示出来。两个部分都使用C语言,利用vi编辑器,通过Berkeley套接口编程实现相关功能。要求:
(1)主要实现一个Linux下的局域网聊天工具的设计,进一步掌握vi,gcc等工具的使用,并且熟悉Linux下的网络编程,以及多线程编程。
(2)通过实际项目的分析、安装、配置、测试等工作,掌握用Linux系统下的网络聊天
室的应用。
1.3课程设计内容
本课程设计主要实现一个Linux下的局域网聊天工具的设计。该设计主要分为两部分,客户端部分和主机部分。运行服务器端程序可以和任意运行了客户端程序的主机进行通信,通信内容能够通过终端显示出来。两个部分都使用C语言,利用vi编辑器,通过Berkeley套接口编程实现相关功能。技术介绍
2.1TCP和UDP介绍
(1)UDP通信
UDP是用户数据报协议的简称。它是以中午连接的逻辑通信信道。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。它的特点是:因无连接,故提供的是不可靠的信道,但也是因无连接而具有很好的传输效率。(2)TCP通信
TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空资源。两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现,如实验图2-1所示。
图2.1 用三次握手建立TCP连接
对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图2-2所示。
图2.2 TCP连接的释放过程
2.2客户/服务器模型
在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递[3]。所以多个客户端之间的通信就变为了客户端与服务端的通信。所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程如实验图2-3所示。
图2.3 Socket通信流程图
2.3网络套接字(socket)的概念
Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。
使用Socket接口进行网络通信的过程如图1-3所示,简要步骤如下:(1)建立一个Socket.(2)按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。(3)按要求通过socket发送和接受数据。(4)关闭此socket。
这是通过Socket实现点对点通信需要掌握的4个编程要点。
2.4多线程的概念
上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。
对于多个并发的任务需要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。
那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢?
在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。
因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。系统设计
3.1 系统结构设计
本系统采用客户/服务器模型,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户端/服务器模式的TCP/IP。在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递[4]。所以多个客户端之间的通信就变为了客户端与服务端的通信。
服务器端和客户端的主要组成如下:
服务器端:套接字创建函数Socket(),端口绑定函数Bind(),套接口监听函数Listen(),接受连接函数Accept(),数据收发函数Read()和Write(),以及套接口关闭函数Close()。客户端:套接口创建函数Socket(),套接口连接函数Connect(),数据收发函数Read()和Write(),以及套接口关闭函数Close()。
3.2通信设计
首先运行服务器端程序,通过Socket()函数会建立一个套接字,然后通过Bind()函数绑定一个端口,然后调用Listen()在套接字指定的端口上开始倾听,利用Accept()从完全建立连接的队列中接受一个连接,连接获得后使用Read()和Write()函数进行通信。通信结束后调用Close()关闭套接字描述符。
运行客户端的程序,调用Socket()函数建立一个套接字,使用Connect()函数与服务器端进行连接,连接完成后,使用Write()和Read()与服务器端进行通信,通信结束后调用close()关闭套接字描述符。
4系统实现
4.1系统调用相关函数
(1)Socket()
作用:socket函数为客户机或服务器创建一个sokcet 格式:
int socket(int family,int type,int protocol);
参数说明:
Family:表示地址族,可以去AF_UNLX和AF_INT。
其中,AF_UNLX只能够用于单一的UNIX系统进程间通信;AF_INT是针对Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。
Type:网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP协议,这样提供按顺序、可靠、双向、面向连接的比特流;SOCKE_DGRAM表明使用的是UDP协议,这样只会提供定长、不可靠、无连接的通信。(2)bind()格式:
int bind(int sockfd,struct sockaddr *addr,int addrlen);
参数说明:
Sockfd:socket的文件描述符号。
Sockaddr:表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口)
Addrlen:设置结构大小长度。(3)listen()格式:
int listen(int sockfd, int backlog);
作用:监听连接信号,和accepted函数合同。
参数说明:
Sockfd:表示socket调用返回的文件描述符。
Backlog:表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义5~10个。(4)accept()
格式:
Int accept(int sockfd, void *addr, int *addrlen);
作用:与listen函数合用,监听信息、接收客户端请求。
参数说明:
Sockfd:表示socket的文件描述符。
Addr:表示指向局部的数据结构struct sockaddr-in的指针。
Addrlen:表示地址的长度。(5)connect()格式:
int connect(int sockfd , struct sockaddr *serv_addr , int addrlen);作用:在面向连接的系统中客户及连接服务器时使用,connect必须在bind后使用。
参数作用:
Sockfd:表示socket的文件描述符。
Serv-addr:表示村访目的端口和ip地址(套接字)的数据结构。(6)send()和 recv()
格式1:
Int send(int sockfd, const vod *msg,int len, int flags);
功能:发送信息。
格式2:
Int recv(int sockfd , void *buf,int len, usigned int flags);
作用:用于流式socket、数据报socket内部之间的通信。(7)close()和 shutdown()格式:
Close(int sockfd)或
Int shutdown(int sockfd , int how);
参数说明:
How的值为下面一种:
0----不允许继续接收;
1----不允许继续发送;
2---不允许继续发送和接收。
(8)有关线程的系统调用函数pthread_create()、pthread_join()
4.2 系统实现过程说明
(1)监听连接
利用socket、bind、listen建立连接,步骤是: 1)
先用socket函数初始化socket,创建新的sockfd。
Sockfd = socket(AF_INT,SOCK_STREAM,0)2)此步骤涉及到IP地址及其处理过程。参数说明:
inet_addr 函数 INADDR_ANY 该函数把由小数点分开的十进制IP地址转为unsinged long 类型,而在实验中所使用的为INADDR_ANY,使用利用自已的IP地址自动填充。1)利用bind函数绑定端口和IP地址。
My_addr.sin_family=AF_INET;
/*将地址族类型设定好 */ My_addr.sin_port=htons(MYPORT;
/* 将端口给其赋值*/ My_addr.sin_addr.s_addr=INADDR_ANY;/*用连接地址自动填充ip*/ Bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr));/*sockfd 是分配的socket名字,my-addr则便是分配好的端口与IP,用bind绑定*/ 2)利用listen监听请求(2)
发送请求
1)利用gethostbyname获取主机信息。2)初始化socket端口。
3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。
(3)主机接收请求,进行数据通信
1)主机利用accept接收请求。2)创建子进程,显示欢迎信息;
3)接收返回信息,显示连接成功,并推出连接; 4)关闭客户端口socket;
5)关闭服务端socket,结束子线程。运行效果
(1)在编写完TCP服务端程序server.c后,用 gcc –lpthread –o server.c server 生成程序server。
(2)在编写完TCP客户端程序client.c后,用gcc –lpthread –o client.c client 生成程序client(3)在主机上打开一窗口,运行server。
(4)再打开另一个窗口或者在另一个主句上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的正确性。输入:【主】#./server 【从】#./client 127.0.0.1 输出:【主】#server:got connection from 127.0.0.1(5)客户端、服务器端窗口之间以及交错发送信息的方式相互发送和接收信息。
1)客户端、服务器端窗皆通过键盘输入消息内容平回车,以发送消息给对方; 2)消息中若使用空格,则作为本条消息结束及下一条消息的开始; 3)输入exit则推出运行。
开始运行后,服务器端窗口的执行顺序为:
1)输入“hi nihao”发送给客户端,如图5.1所示。
图5.1 服务器发送消息
2)接收客户端发来的”ni hao”,如图5.2所示。
图5.2 接收客户端消息
3)输入exit结束。
开始运行后,客户端窗口的执行顺序为:
1)接收服务器端发来的消息“hinihao”,如图5.3所示。
图5.3接收服务器端消息
2)发送消息“hinihao”给服务器端如图5.4所示。
图5.4 客户端发送消息
3)键入exit结束。
上述运行结果表明,客户端与服务器端之间传递的消息已被对方成功接收。结束语
这次课程设计可谓收获颇大,首先从一开始对 linux一无所知甚至是畏惧 ,到做完实验后有了一定程度的了解,如果没有这次实验 ,我想我很难有机会去接触从而进一步熟悉 linux这个操作系统以及在 linux下的编程.通过实验我认识到了系统调用的实现原理 ,系统信息和状态的读取 ,特别是最后一个实验应该说比较具有代表性 ,是一个很好的 linux环境下编程的例子.也让我从中学到了不少 linux的知识.经过近了两周的设计和开发,网络聊天室的设计设计完毕。其功能基本符合用户需求,能够简单的网络聊天功能。但是由于课程设计时间较短,还有许多不尽如人意的地方,还有待于我们进一步完善其功能。但我从中学到了不少的道理,真正的理解到,理论与实践之间还是有很大的距离,这必将有利于我们以后的学习。通过此次课程设计,使我更加扎实的掌握了有关Linux方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。在本次课题程序设计中,我学到了很多东西,通过本次课题程序设计,无论在理论上还是在实践中,我的计算机应用水平得到了很大的提升,这对于今后的工作和学习都是一种巨大的财富。
参考文献
[1]赵敏哲,64位Linux操作系统与应用实例[M].北京:机械工业出版社,2001 [2]庞丽萍,操作系统原理(第三版)[M].武汉:华中科技大学出版社,2000 [3]张饶学,Linux网络编程[M].北京:清华大学出版社,2000 [4]金钟夫,杜刚.浅析socket网络编程[J].微计算机信息,2002,3-2,87-89 [5]王群,许中万.Linux优势分析[J].计算机与现代化,2003(10):7-8
附 录
服务端源程序清单如下,文件名为server.c #include #define MYPORT 3490 #define BACKLOG 10 #define MAXDATASIZE 1024 int sockfd,new_fd;pthread_t accthread,recthread; void recmessage(void){ while(1){ int numbytes; char buf[MAXDATASIZE]; if((numbytes = recv(new_fd,buf,MAXDATASIZE,0))==-1){ perror(“recv”); exit(1); } buf[numbytes] = ' '; if(strcmp(buf,“exit”)== 0){ printf(“Client is closedn”); close(new_fd);close(sockfd);exit(1);} printf(“Client:%sn”,buf); } } void acceptconnect(void) / *与listen函数合用,监听信息、接收客户端请求*/ { struct sockaddr_in their_addr;int sin_size;sin_size = sizeof(struct sockaddr_in);if((new_fd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1){ perror(“accept”); exit(1); } printf(“server:got connection from %sn”,inet_ntoa(their_addr.sin_addr)); if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!= 0){ printf(“Create thread error!rn”); exit(1); } } int main(void){ struct sockaddr_in my_addr;if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ perror(“socket”); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1){ perror(“bind”); exit(1); } if(listen(sockfd,BACKLOG)==-1){ /*监听连接信号*/ perror(“listen”); exit(1); } if((pthread_create(&accthread,NULL,(void *)acceptconnect,NULL))!= 0){ printf(“Create thread error!rn”); exit(1); } while(1){ char msg[MAXDATASIZE]; scanf(“%s”,msg); if(send(new_fd,msg,strlen(msg),0)==-1){ perror(“send”); close(new_fd); exit(1); } if(strcmp(msg,“exit”)== 0){ printf(“Byebye!n”); close(new_fd); close(sockfd); exit(1); } } return 0;} 客户端源程序清单如下,文件名为client.c #include #define PORT 3490 #define MAXDATASIZE 1024 int sockfd;pthread_t recthread; void recmessage(void){ while(1){ int numbytes; char buf[MAXDATASIZE]; if((numbytes = recv(sockfd,buf,MAXDATASIZE,0))==-1){ perror(“recv”); exit(1); } buf[numbytes]=' '; if(strcmp(buf,“exit”)== 0){ printf(“Server is closedn”); close(sockfd); exit(1); } printf(“Server:%sn”,buf); } } int main(int argc,char *argv[]){ struct hostent *he; struct sockaddr_in their_addr; if(argc!= 2){ fprintf(stderr,“usage:client hostnamen”); exit(1); } if((he=gethostbyname(argv[1]))== NULL){ herror(“gethostbyname”); exit(1); } if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ perror(“socket”); exit(1); } their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero),8); if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)/*在面向连接的系统中客户及连接服务器时使用*/ { perror(“connect”);exit(1); } if((pthread_create(&recthread,NULL,(void *)recmessage,NULL))!=0){ printf(“Create thread error!rn”); exit(1); } while(1){ char msg[MAXDATASIZE]; scanf(“%s”,msg); if(send(sockfd,msg,strlen(msg),0)==-1){ perror(“send”); close(sockfd); exit(1); } if(strcmp(msg,“exit”)== 0){ printf(“Byebye!n”); close(sockfd); exit(1); } } return 0;} JAVA聊天室程序设计总结 大二第一学期末我们进行了为期两周的java实习,这次的实习内容是设计一个多人聊天室。在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、MSN,网络聊天时一类的聊天系统的发展日新月异,因此老师布置了制作一个有简单聊天功能的网络聊天程序的课程;而且通过制作该程序还能更好的学习网络软件编程知识。 一、设计内容 利用java语言实现聊天室程序。聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务器端才可以实现正常的聊天功能。设计的聊天室能实现用户登录,显示登录用户列表,以及发送聊天信息和显示聊天信息的功能。并可以选择接收信息的用户进行单发或群发的功能,运行程序,登录服务器后,可以从列表中选择单个或多个用户进行聊天,它是图形界面,线程,流与文件系统等技术的综合应用。 二、实现功能 1、启动服务器端,接收客户端发来的信息,并在服务器端窗体显示客户端聊天信息,再吧信息返给在线用户。 2、启动客户端,进入客户端页面,输入用户名,点击登录按钮,在显示在线用户列表内显示用户名。 3、发送编辑框输入发送内容,单击发送按钮,启动输出流,把信息发送出去,同时把发出的信息追加到聊天内容文本域内,显示用户名,时间和发送内容。 4、聊天信息文本域,在线用户显示域和发送信息的文本域加了滚动条,其中聊天信息文本域,发送信息的文本域的文字能自动换行。 5、别的客户端发来信息是通过输入流读取信息,并截取发来信息的用户名及信息,用户名加到在线用户列表上显示在线,信息追加到聊天内容文本域内,显示用户名,时间和发送内容。 三、设计收获 这是大学以来第一次自主设计一个聊天程序,于我来说还是很有新鲜感但同时也有着稍许担心。通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,但经过一次又一次的思考,一遍又一遍的检查和在老师、同学们的帮助下,慢慢的走上了成功之路,同时也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。这次课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。让我不仅学会了书本上的知识,还让自己能够面对困难并且克服它使我更加扎实的掌握了有关JAVA方面的知识。过而能改,善莫大焉。在聊天室设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。程序虽然完成,但是距离优秀仍存在一定差距,用JAVA开发大型项目还有很多我需要去努力学习的知识。希望自己能不断学习和实践,争取以后做得更好。 嵌入式Linux学习心得 1、Linux命令 ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录 cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息 mkdir:创建目录 fdisk: 查看硬盘分区信息,-l以列表方式查看 ->代表是链接文件,类似window下的快捷方式。 cp: 复制命令,例子cp 文件名 /home/dir/ mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d man:查看某个命令的帮助,man 命令 2、各系统目录的功能 drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。 /boot/gruff.conf: 启动引导程序 /dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。 /home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。 /lost+found:系统意外终止,存放一些可以找回的文件。 /mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如 果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d /opt:用户安装的应用程序 /proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息 对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。 /sbin: 系统管理的一些工具。如poweroff关机工具。 /usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码 /var:存放是临时变量 3、 Java聊天室实验报告 班 级:学 号:姓 名: ****** ******** *** 目录: 一、实验目的.......................................................3 二、所需技术.......................................................3 三、需求分析.......................................................3 四、系统设计.......................................................4 1、服务器结构..................................................4 2、客户端结构..................................................4 五、实现细节.......................................................5 1、客户端细节...................................................5 2、服务器细节...................................................6 六、系统展示.......................................................7 七、实验小结.......................................................9 Rain153 WeChat 聊天室系统一、实验目的: 1、使用Java技术完成聊天室系统,深入学习使用Java语言。 2、使用Java 的多线程机制,深入理解Java多线程技术的应用。 3、使用GUI,对JFrame的深入学习。 4、使用网络编程,掌握基于TCP协议的Socket编程,了解Socket编程的协议约定,掌握简单应用协议的开发。 5、使用C/S架构,对网络编程有一定的了解。 二、所需技术 本系统要求使用java技术开发。所需知识包括java程序设计语言、swing基本GUI组件、多线程编程、socket编程、集成开发环境使用eclipse。系统采用两层C/S体系结构,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能; S端是聊天系统的服务器。 三、需求分析 开发一个类似QQ 的聊天室系统,即WeChat聊天系统。该系统应具有如下功能: 1、2、用户注册、登录 群聊; 3、私聊; 4、服务器发送系统消息; 5、服务器踢人; 6、保存日志; 7、保存聊天信息; 四、系统设计 1、服务器结构 启动服务器监听AppServer服务器控制监听窗体ServerFrameConnection处理所有用户请求 服务器端结构图示 2、客户端结构 启动客户端ChatClient用户登录窗体Login用户聊天主窗体ChatRoom时钟窗体ClockRegister用户注册窗体Windowclose用户窗体监听器 客户端结构图示 1、AppServer.java 为服务器端监听类,负责服务器的启动,包括启动监听端口、服务器监控界面。 2、ServerFrame.java 为服务器监控窗体,负责监控服务器运行状态。 3、Connection.java 为服务器连接处理的具体实现。 4、ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。 5、Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。 6、Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 7、ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器的Connection合作。 8、Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 9、Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。(可选) 五、实现细节 概述:聊天室主要功能的实现:从界面输入登录信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket,专门负责与此客户端socket的通信。一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。客户方和服务方都可以通过关闭本方的socket而结束一次通讯过程。为了实现多客户在线的请求,使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理。 一)客户端细节 1、注册: 当选择注册时,Register界面等待用户输入注册信息,并将信息封装成Register_Customer类,然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。客户端显示注册结果。 2、登录: 当选择登录时,客户端由Login 界面等待用户输入登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。若登录成功,客户端将启动聊天室主界面。 3、聊天 a、发送聊天信息:私聊功能需在在线列表中选中私聊聊天对象,并勾选私聊选项。群聊功能取消对私聊功能的勾选即可。当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、表情和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。 b、接收聊天信息:用一个单独的接收线程实现,客户端必须随时接收服务器发来的消息,而读取消息的方法采用的是阻塞式方法,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。发送和接收可以同时进行。二)服务器端细节 1、注册:创建一个File文件类,载入“user.txt”,再用对象输入流ObjectInputStream包装File文件类,将存储在“user.txt”得向量对象Vector中载入内存中,现在系统中的向量就是对象型数据库,存储着每条用户信息对象。判断是否是第一个注册用户,判断用户名是否已经存在,判断用户名是否为系统关键字,用户名有效后 写入数据库,并给客户端返回信息,关闭Socket连接。 2、登录:去数据库读用户数据,打开用户数据库文件“user.txt”,将用户数据对象集载入内存,以供下面的程序使用。验证用户名是否存在,验证用户密码是否正确,验证用户是否已经登录,验证是否已经超过最大登录人数,如果以上验证全部正确,返回客户端信息,关闭Socket连接。 3、退出:接收退出信息,当用户退出时,客户端将会用基于Socket的对象输出流发给服务器退出对象,把用户从在线列表中删除,更新在线列表。 4、聊天:接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提出消息类型,再根据类型将消息强制转化ChatMessage,调用ChatMeaage中方法,获取目的客户名称列表,根据目的地用户名从用户名、socket键值表中获取socket,再通过socket将Message转发到相应的用户。 六、系统展示 1、注册 客户端注册界面 2、登录 客户端登录界面 3、聊天界面 聊天界面 4、服务器界面 服务器管理界面 服务器用户信息管理界面 七、实验小结 本次实验是比较复杂的一个题目,采用C/S架构设计的聊天室,使用增量迭代方式开发,从初始的0.1版到最终的2.0正式版。通过本次实验,对C/S架构有了较深的认识,也对多线程编程、网络编程、GUI的认识更清晰。在项目中遇到很多问题,在解决问题的过程中,对Java也渐渐的熟悉,尤其是对各种异常的处理更是对自己的一种锻炼。在此次实验中应用了很多上课时未讲到的知识,自己查阅API,阅读JDK源码学习方法的使用让自己收获颇丰。由于这是一个人的项目,虽然在项目的实施上很自由,可到问题没有人讨论,耗费了很多精力,不过这也是提高自己的好方法。 该Rain153 WeChat聊天室由于时间原因,很多功能实现的并不合理,也有些功能尚未实现。Rain153 WeChat并未与数据库连接,只是简单的用文件保存用具信息及消息记录。 UML课程设计 题 目 网络聊天程序开发设计与实现 学 号:201515614376 姓 名: 卫国辉 指导教师: 完成时间:2017年 12月 0 目录 1.摘要.............................................................................................................................2 2.绪论.............................................................................................................................0 2.开发环境.....................................................................................................................0 3.需求分析....................................................................................................................1 3.1程序简介...........................................................................................................1 3.2程序功能...........................................................................................................1 4.系统设计.....................................................................................................................2 4.1概要设计...........................................................................................................2 4.2详细设计............................................................................................................2 5.测试.............................................................................................................................7 6.结论.............................................................................................................................9 参考文献......................................................................................................................10 摘要 本次训练主要是考查了对JAVA程序设计的综合运用,设计一个Socket通信的聊天程序,用户可以通过程序进行聊天通信,但不支持用户自定义表情及图片的发送。 本程序设计也用到了一些相关的标准Java的类,给程序设计带来了许多的方便,但用那些要切记加相应的类的包,还有一些构造方法和个别接口方法。 本程序可以实现用户之间的一些简单的交互,虽然功能较少,但是我想通过这次程序设计来熟悉并且学习更多关于JAVA编程的东西,来便于以后可以使用。 关键词:java聊天 1.绪论 对于一个选择网络编程的人来说,必须要有足够的细心和耐心,因为编程一般来说是很枯燥的乏味的,而且程序会越来越复杂,它所用到的符号、标记很多,所以不能出点小错误的。还有,我们不能只是看程序,要学会把自己学的自己拿去实践,自己去编一些程序,培养自己的动手能力,掌握一些编程技巧,熟练运用自己学到的理论知识,这样在以后才能开发出属于自己的东西。 如今,随着科学技术的发展,计算机已成为了我们生活中必不可少的设备了,而掌握计算机知识和运用,又成了我们每一个人的目标了。现在IT行业的飞速发展,无不应正了以前、现在、将来计算机行业都是科学发展的主导行业。而这些基本上都建立在程序上的,所以程序员对计算机行业来说,可想而知有多么的重要了,他们所付出的每一滴汗水都将推动这个行业的发展。 现在我就用JAVA语言编写一个简单的程序——Java聊天程序。将所学的基本知识用到其中去,这里包括了构造方法,创建图形界面,引用类等等。这不仅能锻炼我的实践能力,同时也进一步复习和巩固了我所学的理论知识。对以前没有学好的还有督促和促进作用。而且,根据需要,还可以了解一些课外的知识。增加自己的知识面。 2.开发环境 在开发此聊天程序时,该项目所使用的软件开发环境如下: 操作系统:Windows 7 开发工具:eclipse3.2及其VE插件 0 Eclipse简介 Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具。 Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语 言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持 使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多 大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。 3.需求分析 3.1程序简介 随着网络技术的发展,人们越来越多的依赖于网络,为了方便人们的生活,网络聊天自然成为了热点,各种工具到处都是。此程序便是模仿其他聊天工具设计的,当然只是实现了比较少的功能,可以进行基本的聊天。 3.2 程序功能 该程序功能:该程序分为2个部分,一个是客户端程序,一个是服务端程序,需要先开启服务器,再开启客户端才能使用,客户端程序提供了相互通信、清空聊天记录的等功能,服务端则用于接受客户端的请求,记录客户端的信息等。 4.系统设计 4.1概要设计 此聊天程序共有2个部分,客户端和服务器。客户端中包含了1个Java文件,为主类client.java,;服务器端只有一个主类Server.java。 程序流程图: 服务器程序结构 客户端程序结构 4.2详细设计 (1)服务器程序实现 本程序采用的是Socket通信来设计的,建立一个主类Server.java,其中主类中还包括服务器线程 然后在其构造方法加载程序所需的组件,构造方法如下: public ClientThread(Socket socket){ try { this.socket = socket; reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); writer = new PrintWriter(socket.getOutputStream()); // 接收客户端的基本用户信息 String inf = reader.readLine(); StringTokenizer st = new StringTokenizer(inf, “@”); user = new User(st.nextToken(), st.nextToken()); // 反馈连接成功信息 writer.println(user.getName()+ user.getIp()+ “与服务器连接成功!”); writer.flush(); // 反馈当前在线用户信息 if(clients.size()> 0){ String temp = “"; for(int i = clients.size()1;i >= 0;i--){ clients.get(i).getWriter().println(”ADD@“ + user.getName()+ user.getIp()); clients.get(i).getWriter().flush(); } } catch(IOException e){ e.printStackTrace(); } } @SuppressWarnings(”deprecation“) public void run(){// 不断接收客户端的消息,进行处理。 String message = null; while(true){ try { message = reader.readLine();// 接收客户端消息 if(message.equals(”CLOSE“))// 下线命令 { contentArea.append(this.getUser().getName() + this.getUser().getIp()+ ”下线!rn“); // 断开连接释放资源 reader.close(); writer.close(); socket.close(); // 向所有在线用户发送该用户的下线命令 for(int i = clients.size()1;i >= 0;i--){ if(clients.get(i).getUser()== user){ ClientThread temp = clients.get(i); clients.remove(i);// 删除此用户的服务线程 temp.stop();// 停止这条服务线程 return; } } } else { dispatcherMessage(message);// 转发消息 } } catch(IOException e){ e.printStackTrace(); } } } 其运行截图如下图所示: (2)、客户端主程序 本程序使用了默认的卡片布局方式,对窗口的大小进行设置,让聊天窗口能 够居中显示,以及登录主窗口类。 实现窗口布局功能和类的调用功能的主要代码如下: * 连接服务器 * * @param port * @param hostIp * @param name */ public boolean connectServer(int port, String hostIp, String name){ // 连接服务器 try { socket = new Socket(hostIp, port);// 根据端口号和服务器ip建立连接 writer = new PrintWriter(socket.getOutputStream()); reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); // 发送客户端用户基本信息(用户名和ip地址) sendMessage(name + ”@“ + socket.getLocalAddress().toString()); // 开启接收消息的线程 messageThread = new MessageThread(reader, textArea); messageThread.start(); isConnected = true;// 已经连接上了 return true; } catch(Exception e){ textArea.append(”与端口号为:“ + port + ” IP地址为:“ + hostIp + ” 的服务器连接失败!“ + ”rn“); isConnected = false;// 未连接上 return false; } } (5)、聊天窗口程序设计 程序提供了发送文字和关闭聊天的的简单功能。以下是实现程序的主要方 法: * 发送消息 * * @param message */ public void sendMessage(String message){ writer.println(message); writer.flush();} /** * 客户端主动关闭连接 */ @SuppressWarnings(”deprecation“)public synchronized boolean closeConnection(){ try { sendMessage(”CLOSE");// 发送断开连接命令给服务器 messageThread.stop();// 停止接受消息线程 // 释放资源 if(reader!= null){ reader.close(); } if(writer!= null){ writer.close(); } if(socket!= null){ socket.close(); } isConnected = false; return true; } catch(IOException e1){ e1.printStackTrace(); isConnected = true; return false; } } 其运行截图如下图所示: 5.测试 程序在编码过程中,出现了许多的问题,有的是因为程序的完善性不够好而造成的,有的是因为技术不够而无法解决。通过不停的调试,修改,多数已发现的问题都已完善,但依然存在少数的问题无法解决。例如,在用户注册这个功能中,当用户的用户名重复时,服务器会出现用户名重复的异常,服务器就不会响应。 6.结论 通过这次程序的实训,我知道了自己在许多地方的不足,虽然书上的程序基本能看懂,但是自己的编程实践能力实在是欠缺,而且我知道了,Java语言最重要的不仅仅是学好语法,而Java中最重要的还是要理解它的面向对象编程的思想,理解它的面向对象的特征。因为学习任何一门语言最重要的就是理解它的思想,要做到知其然,并且知其所以然。要学会真正的编写程序,而不仅仅是把语法背的滚瓜烂熟。还要经常写代码,做到一边写一边理解,这样才能真正的实现学习Java语言的目的。 这次实训也告诉了我,光有书上的知识对我们来说是远远不够的,如果我们要想让自己在编程上有所突破的话,我们必须拓展自己的知识面,此次程序设计就给我增加了不少的知识,让我在编程方面学到了许多编程所需要的东西,还有也锻炼我的耐性,磨砺了我的意志,在错误面前反复修改但是从不气馁。 所以,这次实训让我受益匪浅,不管是在知识方面还是做事方面,都交会了我许多。同时还巩固了以前所学的知识,学到了不少书本上没有的知识;学到了很多java编程知识,并学会了简单的使用Eclipse来开发Java程序的一些使用技巧这次课程设计是对我本学期所学的知识的检验,由此我发现了不少的问题。可以说它给了我一次自我评估的机会。通过设计让我知道了那些方面我还是有欠缺的,促使我花时间弥补。 临近考试,时间太紧迫,致使程序实现的功能在方法上也许不是很完美,但我以后会多向老师请教,自己也要加强对Java 的学习。努力进一步提高自己的编程水平。 参考文献 [1]耿祥义.Java课程设计:清华大学出版社第二版,2008年11月.[2]马皓.Java语言程序设计:机械工业出版社,2007年3月 [3]孙卫琴.java 面向对象编程.电子工业出版社.2007 [4]刘海军.Java程序设计.中国铁道出版社,2006 [5]郑阿奇,姜乃松,殷红先.Java实用教程.电子工业出版社,2005 [6]张广彬、王小宁、高静, Java课程设计案例精编(第二版)清华大学出版社,2011年第二篇:java聊天室设计总结
第三篇:嵌入式linu学习心得
第四篇:JAVA聊天室实验报告
第五篇:Java聊天室课程设计报告