版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、秦川、刁俊方、钟杨杨:点对点数据交换(p2p)羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀
2、蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁
3、薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂
4、芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆
5、蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇
6、膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀
7、莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀袈蚃莈艿薈羈芄芈蚀螁膀芇螃羇肆芆蒂蝿羂芆薅羅芀莅蚇螈膆莄蝿羃肂莃蕿螆肈莂蚁肁羄莁螃袄芃莀蒃肀腿莀薅袃肅葿蚈肈羁蒈螀袁芀蒇蒀蚄膆蒆蚂衿膂蒅螄螂肈蒄蒄羇羄蒄薆螀节蒃虿羆膈薂螁蝿肄薁蒁羄羀薀薃螇艿蕿螅羂芅蕿袇袅膁薈薇肁肇膄虿袃羃膃螂聿芁膂蒁袂膇节薄肇肃芁蚆袀罿芀 基于java简单的聊天程序摘要 随着网络越来越流行和大众化,各种网络工具也逐渐走入生活中,它让我们的生活更加方便快捷,所以对于网络工
8、具的开发与应用需求就更加迫切。互连网对我们老百姓的生活更是产生了巨大的影响。信息与人类的生存更加休戚相关,人们一时一刻也离不开信息,无时无刻不在与信息打交道,不断的利用信息为自己的生存和发展服务。在不知不觉中,以互连网为主要标志的信息化已经给人类生活、学习、办公、够物、出行、就医、娱乐等带来深刻影响。其中聊天工具为我们开拓一片广阔的网络天地,这使我们的交流变得更加方便,也节约我们很多的资源。本次课程设计中,我们用到基于java的socket通信,基于ve可视化编程插件,swing组件等。此外我们自定义了协议(套接字),首先是登陆(只用到了用户名),然后就是发送消息和传送文件两大功能,当同时进行
9、的时候,需要用到多线程:一个线程处理文件传输,另一个线程处理消息发送。在服务器端,对消息的处理、解析也是用到多线程,因为当接到一个消息请求以后,必须把它交给一个线程处理,否则服务器将没有机会继续监听,这样就会使其他用户得不到响应,导致系统的处理效率很低,所以我们的设计主要以尽量提高效率和友好的用户操作界面为主。小组具体分工:秦川:主要负责server服务器程序的编写和协议的设计,并参与任务书的一部分刁俊方:主要负责client客户端的编程和界面的设计,并参与任务书的一部分钟杨杨:和刁俊方一起编写客户端和设计界面,也参与任务书的一部分总的来说,本次课程设计我们小组还是以合作为主,大多数思想都是经
10、过大家讨论得出的设计方法,整体的架构设计也是编写程序之前商量建立好的,程序结构是也是开发初期、中期以及后期一起研究,毕竟我们分开写的代码,所以组合的时候需要修改一些内容,这时必须在一起讨论。只是说写代码的时候完全分开写,这样有利于各类算法的设计,编写起来更加得心应手。一、 总体分析1.1课程设计要求通过计算机网络课程设计,旨在通过该课程设计,使学生了解、掌握tcp、udp协议的原理;了解、掌握socket编程的方法;了解、掌握应用协议设计的思想;利用winsock api或者java socket api编制一个能部署在internet上的点对点数据交换(p2p)、http/ftp服务器系统、
11、共享白板。要求每组学生(23人/组)从上述3个系统中任选一个,独立完成系统的功能设计和实现,使所实现的系统可以能够包含主要的内容要求,并要求学生必须在报告中明确具体分工情况。1.2学生完成的工作分组 23人/组。 内容:协议编程。语言:java或c+。3个题目任意两个一组供一个班级选择。1) 点对点数据交换(p2p):实现基于服务器转发的任意多点间的数据共享与交换。2) http/ftp服务器系统:http/ftp客户端系统和http/ftp服务端系统。3) 共享白板:实现基于服务器转发的多点间的文字,简单图案等信息的远程实时共享。1.3设计背景在今天的生活中,我们深刻的体会到我们离不开网络,
12、我们可以利用网络完成很多有意义的事,可以说网络给我们带来了太多的方便,使我们的生活丰富多彩,在我们的生活中发挥着极大的作用,它改变了传统的生活方式,使我们的生活上升了一个档次。,而在这其中,有一个千千万万人都离不开的东西-聊天工具,而且各种各样的聊天工具如雨后春笋般诞生,技术也越发成熟,非常著名的qq等产品发展日新月异。因此,基于我们实际的知识结构构成以及网络聊天在当今时代的盛行趋势,本课程设计小组选择了课程设计题目点对点数据交换(p2p),用于实现基于服务器转发的任意多点间的数据共享与交换。其具体设计内容如下:1)类似p2p的qq聊天系统,有客户端和服务器端。2)服务器端记录当前在线客户列表
13、,把客户列表发送给每一个在线客户,并实时刷新。3)任一个客户可以和任意其它的客户进行交互,即从在线客户列表中选择一个或一组其它客户通过服务器转发彼此进行交互,包括信息交互,文件交互(文件传输)。1.4开发环境与工具根据老师的要求,我们选择了作为目前internet上最为流行的编程语言之一的java语言作为编程工具,并选择可扩展的免费开放源代码集成开发环境eclipse-jee-helios作为开发平台和使用ve可视化设计编程。由于java语言的网络特性,与其他语言相比,使用java编写网络通信程序变得非常简单和便捷,本课程小组选择了java socket api来编制这个能够部署在intern
14、et上的点对点数据交换(p2p),整个程序是基于windows7平台开发的。二、总体设计2.1总体设计概念为实现网络聊天的功能,采用java socket编程,服务器与客户端采用了tcp/ip连接方式。在执行过程中,我们设计将所有请求信息先发往服务器端,再由服务器进行分别处理,决定下一步应该怎么做,服务器会对不同的数据包进行不同的处理,比如登录、发送消息、发送文件等,可以说服务器端是所有信息的中转站。2.2系统结构本课程设计按照实验的具体要求,采用c-s结构,首先用socket编程创建客户端和服务器端,它们之间通过一个交互的连接来实现数据通信;在服务器端有一个监听程序,用于监听客户端的消息请求
15、,实现他们的连接。当传输文件的时候,客户端也会建立一个监听程序,来监听其他客户端的连接请求,因为我们在传输文件的时候是设计的在客户端之间直接传送,此时服务器端只做一个消息转发器。2.3界面和功能1)界面本系统只有一个界面,那就是客户端界面,服务器只提供相应的消息处理机制,所以没有制作服务器界面,它不参与客户之间的聊天内容。我们采用ve可视化编程插件,利用swing包进行窗体界面的设计,实现其部分时间。2) 服务器端:主要实现处理客户端发来的请求数据包,不同的信息不同处理,或帮助转发。具体功能如下:1、刷新昵称列表:在有用户登陆或离开的时候实时更新用户昵称列表,并将信息反馈到各个客户端,让它们也
16、更新用户列昵称表;2、监听功能: 实现对客户端发送过来的消息进行监听的功能;3、登陆管理:检查是否有同名用户,若有则提示用户已存在,若无则发消息通知所有用户,同时刷新在线用户昵称列表;4、消息处理:解析客户端与服务器端的消息交互类型,并做出相应处理,能够找到消息所对应的接收端。5、注销管理:当用户注销的时候,发消息通知所有用户,刷新在线昵称列表。3)客户端:主要实现向服务器端发布消息请求,并且对来自服务器和其他客户端的消息做出相应的响应。具体功能如下:1、连接功能:输入用户名,实现登录及注销功能2、登录设置:登录时,发送消息使服务器端获得相关登录信息,昵称及ip地址记录到服务器端的array列
17、表中,注销后发送消息使ip地址及昵称从array列表中删除;3、监听作用:实现对其他客户端发送过来的消息进行监听的功能;4、聊天记录:实现聊天记录的保存功能;5、消息处理:相应从服务器端接收到的消息交互类型,实现用户与用户之间的信息交互和文件交互;6、文件传输:实现客户端之间的文件传输与文件接收功能。三、 详细设计3.1协议结构在java socket通信中使用的协议是tcp协议。tcp协议是tcp/ip协议中面向连接的运输层协议,它提供全双工的和可靠交付的服务。由于通信是全双工方式,因此tcp连接的任何一方都能够发送和接收数据。发送端的应用进程按照自己产生数据的规律,不断地将数据块(其长短可
18、能各异)陆续写入到tcp的发送缓存中。tcp再从发送缓存中取出一定数量的数据,将其组成tcp报文段逐个传给ip层,然后发送出去。接收端从ip层收到tcp报文段后,先将其存在接收缓存中,然后让接收端的进程从接收缓存中将数据块逐个读取。 tcp协议的报文分为首部和数据两个部分。众所周知首部中含有源端口、目的端口、序号、确认号等内容。因此在利用socket通信时,要想实现不同的功能和数据传输,包括指令和纯数据的传输,可以通过在tcp报文的数据部分进行再分段来实现。由此指定一些套接字,并接利用这些套接字来对不同的数据进行分段,这样就能轻松地将提取所需数据以实现不同功能。本课程设计正是利用上述方法来建立
19、一个基于tcp协议的协议。这个协议的主要组成部分为套接字及数据段。在程序中主要使用的套接字有:login、logout、text、file、addr、ack、send、wrong等。其中各个套接字又有不同的使用方法。如果使用的是login,则其后数据为发此数据者登录用的昵称。如果使用的是logout,则其后数据为发送此数据客户端要注销用户。若套接字为text,则表示该用户发出了一个对一的客户消息传送请求,此时,服务器端同样通过控制字头后的昵称,查找到对应的接收端用户信息,并将该消息转发给对应的客户端用户。若套接字为file,则表示该用户发出了一个文件传输请求,此时服务器同样通过控制字头后的昵称
20、,查找到对应的接收端用户信息,并获取起ip地址,传给发送端,发送端根据该ip,直接和等待和该接收端建立socket通信,而接收端则根据得到的发送端ip请求建立连接。若套接字为addr,则表示服务器发送给客户端的数据包是ip地址。若套接字为ack,则表示是一个请求的相应回答报文。若套接字为send,表示文件开始传输的消息。若套接字为wrong,则表示消息发送或文件出错,也可能是其他引起的错误。具体的格式为:套接字+from+源用户名+to+目的用户名+to+数据内容。使用套接字的方法能够把控制信息和数据部分一起传送达到服务器和客户端的不同沟通,这样我们就可以利用服务器来完成我们所需的各个服务,无
21、论是文件传输还是私下聊天都可以,同时还能在某种意义上保护隐私。这个socket的协议就是利用tcp协议的数据流、面向连接和全双通来实现的。3.2数据流程图根据以上的程序模块划分,设计好服务器端和客户端的流程图,如下:服务器端流程: 客户端流程图:四、 系统实现编码及运行结果4.1服务器端设计与编码4.1.1 服务器程序该段功能由server工作组中的servercontrol包中的server.java文件中的server类实现(程序代码请见附录),具体实现过程如下:启动服务并监听:服务器的任务首先是建立一个由ip地址到昵称的映射的哈希表,用于存放用户的基本信息;启动服务器后,等候建立一个连接
22、,然后用这个连接产生的socket创建一个client,同时检查该用户是否已存在哈希表中,若以存在,则提示该次连接请求失败,从而实现限制ip的目的;若不存在,则将该ip地址及其昵称或默认昵称的映射添加到哈希表中,接着服务器端向所有的用户发送管理信息,提示有新的用户登录,并且将刷新后的用户列表同时发送到各个客户端。接受和发送消息: 服务器端解析由客户端发送的请求,若控制字以login开头,则通过控制字后的昵称从array列表中找到对应的用户,实现服务器端到客户端的点对点消息交互;在服务其中,需要同时处理多个客户端的请求,因此此处用到了多线程处理机制。在服务器程序里创建单个server socke
23、t,并调用accept()来等候一个新连接,一旦accept()返回,就取得结果获得的socket,并用它新建一个线程,令其只为那个特定的客户端服务,然后再调用accept(),等候下一次新的连接请求。 4.1.2主要的功能函数该段功能由servermanage.java文件中的servermanage类实现(程序代码请见附录),它是一个线程类,具体用来处理服务器响应请求后,把任务交给一个线程来处理,而自己继续监听。主要实现过程如下:函数servermanage:该函数实现监听到一个请求后,建立一个socket类型的变量,并定义给出输入输出数据流,转入线程。函数原型如下:public serv
24、ermanage (socket s) throws ioexception函数broadcast:该函数实现把服务器收到的信息以广播形式发送给所有在线用户,函数原型如下:public void broadcast(serverprotocol msg) throws ioexception函数run:该函数实现消息已经进入了线程处理、解析过程,以得到响应的后续处理方法,函数原型如下:public void run()类serverprotocol.java文件是包含的协议:函数serverprotocol:该函数是关于协议的设计与说明,本系统就是用的套接字,函数原型如下:public ser
25、verprotocol(socket socket) 类userinfo是有关每个用户基本信息的保存类,主要是用的arraylist来实现:其中只包含一个userinfo方法,就是用来保存昵称等信息的。4.1.3信息处理客户端几乎所有信息都是交给服务器的service负责接受这些信息,并且做出相应的处理。该段功能由service.java文件中的service类实现(程序代码请见附录),具体实现过程如下:该类仍然是使用了java的多线程处理机制,用来响应处理每个客户端的请求,还有就是当传输文件和发送消息同时进行的时候也要用到多线程。当接到请求后转入线程,进行消息类型的判断:如果控制字以logi
26、n开始,则表示该用户登录,将其昵称广播给每一个用户,并更新用户昵称列表。如果控制字以logout开头,则表示该用户以注销,则在用户昵称列表中删除记录,并广播给所有用户,更新用户昵称列表。若控制字以file开始,则表示该用户发出了一个对某一客户端发送文件的请求,此时,服务器端同样通过控制字头后的昵称,查找到对应的接收端用户的信息,并将该用户的ip地址传递给发送端,接下来的工作就交给客户端之间处理。若控制字以text开始,则表示用户之间在发送消息,服务器只需要将其转发给目的客户端。4.2客户端设计与编码由于服务器端需要一次处理多个客户端的请求,所以客户端的设计均使用了java的多线程处理机制实现。
27、4.2.1客户端程序该段功能由clientcontrol包中的client.java文件中的client类实现(程序代码请见附录),具体实现过程如下:新建客户端:初始化该客户端的监听器、套接字、在线用户列表以及发送消息的string流,并且将客户端连接状态设置为真。初始化一个客户端时,需要用到该客户端的ip地址、端口号、在线用户列表以及聊天内容列表等信息。发送消息:客户端循环发送消息给服务器,直到发送的string流遇到结尾字符。4.2.2界面设计该段功能由mainwindow.java文件中的mainwindow类实现(程序代码请见附录),具体实现过程如下: 窗口布局:服务器端窗口使用了bo
28、rderlayout事务管理器,并取消了其布局,而使用我们自定义的布局,在上面放置我们自设的组件,如按钮、标签、文本框、列表、文件菜单等,各个组将构成了一个完整的服务器端界面。如图4-1所示:图4-1 事件处理:通过java的授权事件模型,针对组件textarea、button1button4,通过addlistener(主要运用了addactionlistener)方法注册监听器,并且实现actionlistener接口中的actionperformed方法,这样,当组件触发了相应类型的事件后,此事件就会被传送给已注册的监听器,事件监听器负责处理事件。至此,实现了窗口对以下几个事件的响应:用
29、户登录、退出、保存消息、文件发送、文件接收、文件开始传输、消息发送。4.2.3文件发送该段功能主要实现文件发送,默认端口为4040,由fsend.java文件中的fsend类实现(程序代码请见附录),具体实现过程如下:初始化:使用接收端用户的昵称、需要被传输的文件绝对路径以及聊天记录列表初始化fsend相应的属性。用需要被传输的文件名新建一个文件输入流,通过该文件输入流新建一个缓冲输入流,用于缓冲文件输入数据;同时使用接收端用户的ip地址以及端口号新建一个套接字,并通过该套接字建立一个缓冲输出流,用于文件输出数据的缓冲及刷新,然后使用一个字节数组用于读取文件数据。 初始化进度条:设置其最小值为
30、零,最大值为文件长度除以字节数组长度。发送文件数据:循环从字节数组中读取数据,我们设定每次读取8k字节,若没有到string流的结尾,则更新count值为原值与此时字节数组的长度之和,根据此时的count值修改进度条的值,再将字节数组中的数据写入到用于输出的套接字中,并刷新输出流。主要是用到buffer来进行收发中转。关闭输入输出流以及建立的套接字,系统使用对话框提示用户文件发送成功,再次将进度条设置为不可见,文件长度设置为零,以便下一次文件传输使用。4.2.4文件接收该段功能主要实现文件接收,默认端口为4040,由freceive.java文件中的freceive类实现(程序代码请见附录),
31、具体实现过程如下:初始化:使用需要被传输的文件名以及聊天记录列表初始化frecieve相应的属性。用需要被传输的文件名新建一个文件输出流,通过该文件输入流新建一个缓冲输出流,用于缓冲文件输出数据及刷新;同时使用发送端用户的端口号新建一个服务器套接字,并通过该套接字的accept()方法建立一个缓冲输入流,用于文件输入数据的缓冲,然后使用一个字节数组用于读取文件数据。接收文件数据:循环从字节数组中读取数据,若没有到string流的结尾,则更新count值为原值与此时字节数组的长度之和,根据此时的count值修改进度条的值,再将字节数组中的数据写入到用于输出的文件中,并刷新输出流。也是用到buff
32、er来进行收发中转。关闭输入输出流以及建立的套接字,系统使用对话框提示用户接收文件成功,再次将进度条设置为不可见,文件长度设置为零,以便下一次文件传输使用。 4.2.5消息监听该类主要实现对服务器发送的消息进行监听的功能,由client.java文件中的client类实现(程序代码请见附录),具体实现过程如下:使用缓冲输入流、在线用户列表以及聊天记录列表初始化client对象的相关属性,并启动多线程。循环接收从服务器发送来的信息,直到输入流读到了string流的末尾,接着开始判断消息的类型。若控制字以login或者logout开始,则证明需要更新用户列表,此时客户端进行相关操作。如控制字以“f
33、ile”开始,则客户端需要通过控制字以后的字符获得目的端的ip地址。4.3运行结果4.3.1用户登录4.3.2客户端向所有客户端广播4.3.3客户端与客户端间实现“私聊”4.3.4客户端与客户端之间实现文件传输功能文件发送文件接收用户离开请注意昵称列表的变化,由原来的两个用户编程了一个用户,是因为有用户离线了。五、结论与总结5.1课程设计结论通过4.3运行结果,可以看出,该课程设计利用java应用程序socket编程实现了以下功能:使用java的多线程处理机制建立两个套接字分别作为服务器端和客户端。在服务器端实现了向各个客户端发布系统消息,接受来自客户端的各种信息并分别处理的功能,可以控制客户
34、端的连接以及对用户的管理作用,并且能够适时检测已登录用户的连接状态且刷新在线用户列表,更能够解析客户端与服务器端的消息交互并做出相应处理。在客户端实现了向服务器端发布消息,并且对来自服务器的消息做出相应的响应,可以连接到特定的服务器,设置自己的昵称,并且能够监听服务器端发送过来的消息并做出相应的响应,更加能够与其他用户进行广播或私聊,以及实现文件传输等功能。由此,可见,本次课程设计完成了最初的设计要求,即实现了类似p2p的qq聊天系统,有相应的客户端和服务器端;服务器端可以记录当前在线客户列表,把客户列表发送给每一个在线客户,并实时刷新;任何一个用户都可以和任意其它的用户进行交互,即从在线客户
35、列表中选择一个或一组其它用户通过服务器的转发彼此进行信息的交互以及文件的交互。5.2课程设计总结与体会在本次课程设计中,我们小组综合应用所学过的知识,在使用java应用程序的socket编程机制的基础上,根据传输层的传输控制协议tcp协议的原理,设计点对点数据交换程序,并且实现服务器端和客户端的主要功能。另外,根据自己编写的程序,成功地实现了用户之间的聊天及文件传输功能,这一次的课程设计,使我们掌握了网络传输数据的概念、原理以及设计方法,也加深了对传输控制协议tcp的理解。通过本次课程设计,我们清楚地了解到tcp、udp协议的原理及二者的区别,学会了网络中数据传输的基本概念、基本原理和设计步骤
36、、设计思路和调试步骤,体会到了程序设计结构在整个设计中起到的重要作用,最终能够清晰地解析计算机网络中数据传输这一概念,为进一步的网络知识学习奠定了基础,并且完成对计算机网络这门课程的综合应用,真正体现了“学以致用”的机制。本次课程设计中,因为有老师的参考资料和详细讲解,加上我们自己的知识基础,我们设计小组对理论知识进行了充分研究,虽然开发初期遇到了很多这样那样的难题,但凭借我们的努力,都一一解决,发扬了创新实践精神,积极探索,努力勤勉,共同越过了设计路上的每一处障碍,攻克了一个又一个的难关。最终,友好的协作关系与团队凝聚力促使我们顺利地完成了此次课程设计。本次课程设计,加深了我们对理论知识的理
37、解,比如对服务器端和客户端信息的交互方式,各自的消息处理流程,以及c-s模型的工作过程都有深的掌握,特别是对协议的理解加深了层次,以前不知道协议具体是怎么实现的。但这次课程设计以后,通过自己编制定义的传输协议,这才发现协议其实没有想象的那么难以理解,更加让我们掌握和理解计算机网络这门课程的精髓,也对我们以后在实际的工程设计中起到很大的引导作用,扎下深深的根基。此外,这次课程设计也锻炼了我们的实践能力,更多的是在实践中收获了太多的感触和心得。虽然计算机网络的课程设计已经结束,可我们明白“学无止境”的道理,我们会继续刻苦钻研,求实创新,不断地用知识来充实自己,跟上科技时代前进的步伐,努力让自己变得
38、更优秀,更有能力。在此次的设计中,非常感谢老师对我们的帮助和指导,因为有老师这一学期以来悉心的教导,才使得我们有今天的成果。但我们做得还不够好,希望在以后能更加完善,我相信在不久的将来我们会有很大的进步!六、参考文献1计算机网络第4版 谢希仁 电子工业出版社 2003年6月2用tcp/ip进行网络互联(第一卷)d.e.comer 电子工业出版社2004年11月第四版3tcp/ip网络原理与技术周明天、汪文勇清华大学出版社:19934java程序设计之网络编程李芝兴、杨瑞龙、朱庆生 清华大学出版社 2006年3月第一版 附录 客户端程序/mainwindow.javapackage client
39、;import java.awt.borderlayout;import javax.swing.jpanel;import javax.swing.jframe;import java.awt.dimension;import javax.swing.jtextarea;import java.awt.rectangle;import javax.swing.jlabel;import javax.swing.jbutton;import javax.swing.jscrollpane;import javax.swing.jtextfield;import javax.swing.jlis
40、t;import java.io.ioexception;import java.io.objectinputstream;import java.io.objectoutputstream;import clientprotocol.clientprotocol;import java.io.ioexception;import .inetaddress;import java.util.arraylist;import javax.swing.joptionpane;import javax.swing.defaultlistmodel;import client.mainwindow;i
41、mport client.frecieve;import client.fsend;public class mainwindow extends jframe implements runnable private static final long serialversionuid = 1l;private jpanel jcontentpane = null;private jbutton jbuttonsendmesg = null;private jbutton jbuttonsendfile = null;private jlabel jlabel1 = null;private
42、jscrollpane jscrollpanemessage = null;private jtextarea jtextareamessage = null;private jscrollpane jscrollpanesendmesg = null;private jtextarea jtextareasendmesg = null;private jlabel jlabel = null;private jtextfield jtextfieldlogin = null;private jbutton jbuttonlogin = null;private jbutton jbutton
43、logout = null;private jscrollpane jscrollpanename = null;private jlist jlistname = null;private string username; private objectoutputstream out; private objectinputstream in; private string filepath; private defaultlistmodel userlistmodel = new defaultlistmodel(); public static boolean loginstatus =
44、 false; public static final int add = 0; public static final int delete = 1;overridepublic void run() / todo auto-generated method stub / public mainwindow(objectoutputstream o,objectinputstream i) / out = o; / in = i; / /initcomponents(); / /* * this is the default constructor */public mainwindow(o
45、bjectoutputstream o,objectinputstream i) super();initialize();/* * this method initializes this * * return void */private void initialize() this.setsize(398, 361);this.setcontentpane(getjcontentpane();this.settitle(基于java简单的聊天程序);/* * this method initializes jcontentpane * * return javax.swing.jpane
46、l */private jpanel getjcontentpane() if (jcontentpane = null) jlabel = new jlabel();jlabel.setbounds(new rectangle(11, 34, 60, 26);jlabel.settext(消息显示);jlabel1 = new jlabel();jlabel1.setbounds(new rectangle(286, 34, 55, 23);jlabel1.settext(昵称列表);jcontentpane = new jpanel();jcontentpane.setlayout(nul
47、l);jcontentpane.add(getjbuttonsendmesg(), null);jcontentpane.add(getjbuttonsendfile(), null);jcontentpane.add(jlabel1, null);jcontentpane.add(getjscrollpanemessage(), null);jcontentpane.add(getjscrollpanesendmesg(), null);jcontentpane.add(jlabel, null);jcontentpane.add(getjtextfieldlogin(), null);jc
48、ontentpane.add(getjbuttonlogin(), null);jcontentpane.add(getjbuttonlogout(), null);jcontentpane.add(getjscrollpanename(), null);return jcontentpane;/* * this method initializes jbuttonsendmesg * * return javax.swing.jbutton */private jbutton getjbuttonsendmesg() if (jbuttonsendmesg = null) jbuttonse
49、ndmesg = new jbutton();jbuttonsendmesg.setbounds(new rectangle(280, 272, 94, 41);jbuttonsendmesg.settext(发送);jbuttonsendmesg.addmouselistener(new java.awt.event.mouseadapter() public void mouseclicked(java.awt.event.mouseevent e) try string senduser; if(jlistname.isselectionempty() senduser = all; e
50、lse senduser = (string)jlistname.getselectedvalue(); string mesg = jtextareasendmesg.gettext(); clientprotocol mesg = new clientprotocol(clientprotocol.text,username,senduser,mesg); out.writeobject(mesg); out.flush(); jtextareasendmesg.settext(); catch (ioexception ex) joptionpane.showmessagedialog(
51、null, this, 出错了: + ex.getlocalizedmessage(), 0); );return jbuttonsendmesg;/* * this method initializes jbuttonsendfile * * return javax.swing.jbutton */private jbutton getjbuttonsendfile() if (jbuttonsendfile = null) jbuttonsendfile = new jbutton();jbuttonsendfile.setbounds(new rectangle(288, 4, 89,
52、 25);jbuttonsendfile.settext(文件传送);jbuttonsendfile.addmouselistener(new java.awt.event.mouseadapter() public void mouseclicked(java.awt.event.mouseevent e) system.out.println(mouseclicked(); / todo auto-generated event stub mouseclicked();return jbuttonsendfile;/* * this method initializes jscrollpa
53、nemessage * * return javax.swing.jscrollpane */private jscrollpane getjscrollpanemessage() if (jscrollpanemessage = null) jscrollpanemessage = new jscrollpane();jscrollpanemessage.setbounds(new rectangle(7, 61, 265, 197);jscrollpanemessage.setviewportview(getjtextareamessage();return jscrollpanemessage;/* * this method initializes jtextareamessage * * return javax.swing.jtextarea */private jtextarea getjtextareamessage() if (jtextareamessage = null) jtextareamessage = new jtextarea();jtextareamess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 质量检测合同模板
- 2024年度平房区环境整治:建筑施工合同范本
- 开发商授权拆迁补偿合同
- 2024年住家保姆工作协议
- 劳务协议书样式
- 简单工程承包协议范例
- 2024标准临时用工合同样本
- 2024年苏州市租房合同范本
- 拼车服务协议示例
- 2024中介的买卖合同书范文
- 初中语文人教七年级上册要拿我当一挺机关枪使用
- 北京颂歌原版五线谱钢琴谱正谱乐谱
- 病史采集和临床检查方法
- PSUR模板仅供参考
- 火力发电企业作业活动风险分级管控清单(参考)
- 民法典合同编之保证合同实务解读PPT
- 全国第四轮学科评估PPT幻灯片课件(PPT 24页)
- 大气污染控制工程课程设计-某厂酸洗硫酸烟雾治理设施设计
- 名牌包包网红主播电商直播带货话术脚本
- 高考语文作文素材人物速递——苏炳添课件18张
- 蛋鸡养殖场管理制度管理办法
评论
0/150
提交评论