基于JAVA的UAW聊天室系统 ——客户端通讯-毕业论文_第1页
基于JAVA的UAW聊天室系统 ——客户端通讯-毕业论文_第2页
基于JAVA的UAW聊天室系统 ——客户端通讯-毕业论文_第3页
基于JAVA的UAW聊天室系统 ——客户端通讯-毕业论文_第4页
基于JAVA的UAW聊天室系统 ——客户端通讯-毕业论文_第5页
免费预览已结束,剩余39页可下载查看

下载本文档

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

文档简介

本科毕业论文(科研训练、毕业设计)题 目:基于JAVA的UAW聊天室系统客户端通讯姓 名:学 院:软件学院系:专 业:软件工程年 级:学 号:指导教师(校内): 职称:副教授指导教师(校外): 职称:工程师 年 月 日基于JAVA的UAW聊天室系统客户端通讯摘要 Java良好的跨平台特性在WEB开发应用中显示出了巨大的威力。Java语言面向对象的优势也使得开发软件变得非常容易。本文阐述了使用JAVA编程语言对基于客户/服务器模式的应用编写网络通信程序,讨论了SOCKET机制、输入输出流以及程序实现代码。本文分为六个章节阐述聊天室系统客户端的开发技术和实现细节:第一章:“项目概况”,介绍了此次开发聊天室系统的项目背景;第二章:“项目计划”,说明系统的功能性需求及对应的程序设计方案;第三章:“项目设计”,描述了完成客户端功能涉及的各个类和方法;第四章:“类的设计”,详细阐述了系统实现的一些关键技术的应用;第五章:“业务流程演示”,演示程序主要业务界面;第六章:“结束语”,简要总结此次系统开发的心得与体会。关键词 JAVA 网络 SOCKET 线程ABSTRACTChapter 1: “Project Outline”-introduce the background of chat room development;Chapter 2: “Project Plan”-explain the functions of the system requirement and corresponding plans for program design;Chapter 3: “Project Design”-describe relevant classes and methods to complete system;Chapter 4: “Solution to the Design of the classes in the Program”-detailedly describe the application of several key technologies;Chapter 5: “The view”-display the interface of the programming when running; Chapter 6: “The ending”-Here is the ending of the whole issue.Key Words Java Internet Socket Thread目录第一章 项目概况51.1 项目说明51.2 项目背景5第二章 项目计划62.1 项目目标62.2 项目范围62.3 项目开发周期62.4 代码实现62.5 所采用的工具6第三章 项目设计73.1 需求分析73.2 软件主要功能73.3 程序中所用到的Java知识点详细分析73.3.1 Java中输入/输出流概念:73.3.2 Socket机制83.3.3 Java语言93.3.4 JAVA工具133.3.5 客户机/服务器通信的实现13第四章 类的设计164.1 Java语法在程序中的体现164.2 程序中的类244.3 程序主类ChatClient实现简介28第五章 主要业务流程演示375.1 登陆界面:375.2 欢迎界面385.3 主要聊天界面385.4 显示私聊界面395.5 更换房间39第六章 结束语42致谢语43参考文献44第一章 项目概况1.1 项目说明项目名称:UAW 聊天室系统。1.2 项目背景在软件学院学习将近两年之中,极大地提高了我的专业知识与动手能力;为了进一步考察自己的专业知识水平,提高学习兴趣,为将来的就业打下良好基础,特将毕业设计课题定为现今很有活力的JAVA技术,并将我们很常用的聊天程序作为设计课题,让自己在兴趣中探索技术,在技术提高的同时更加增强自己今后事业的基础与信心。第二章 项目计划2.1 项目目标1. 允许用户登陆。2. 允许用户进行在线的公聊和私聊。3. 允许用户创建私人房间、查找房间并且在房间内聊天。4. 友好的欢迎界面2.2 项目范围本软件适用于一般使用者。2.3 项目开发周期第一阶段:需求分析及初步设计阶段(决定每个功能所需的类及数据类型)第二阶段:根据相应功能设计出各类所用到的方法及数据类型第三阶段:具体实现各个类中的各个方法第四阶段:对各个界面和客户端进行调整及测试完善工作2.4 代码实现JAVA与持久化。2.5 所采用的工具开发工具:Xinox JCreator 3.50 Pro,jdk1.5开发环境:Windows2000 + 个人电脑第三章 项目设计3.1 需求分析随着经济的日益发展,网络的观念深入人心。人们越来越需要通过网络高效简捷的交流,聊天室就是其中的一个工具。3.2 软件主要功能1. 允许用户开设帐户。2. 允许用户进行在线的公聊和私聊。3. 允许用户创建私人房间、查找房间并且在房间内聊天。4. 友好的欢迎界面。3.3 程序中所用到的Java知识点详细分析我用JAVA进行网络编程设计的基本着眼点如下:1. 服务器应设置成多线程,应答多个客户的请求;2. 两端通信使用SOCKET机制。3.3.1 Java中输入/输出流概念:输入流DataInputStream用来从最基本的输入流InputStream读取基本JAVA数据类型(primitive Java data types),这是与具体的平台无关的(JAVA的特点:跨平台)。DataOutputStream用来写数据,这些数据稍后可以被输入流读取。A data input stream lets an application read primitive Java data types from an underlying input stream in a machine-independent way. An application uses a data output stream to write data that can later be read by a data input stream.-摘自 j2se apireadLine()方法用来按行读取。流在用完之后需要关闭,而且必须在socket关闭之前关闭。流的关闭很简单,它的基本步骤为:(以客户端为例)1. 建立客户端socket连接2. 得到socket的读和写的流3. 使用流4. 关闭流5. 关闭socket3.3.2 Socket机制Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全都在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。Socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。在API中,Socket和ServerSocket类库位于包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。This class implements client sockets (also called just sockets). A socket is an endpoint for communication between two machines.The actual work of the socket is performed by an instance of the SocketImpl class. An application, by changing the socket factory that creates the socket implementation, can configure itself to create sockets appropriate to the local firewall.-摘自 j2se .Socket继承于java.lang.Object,它的使用最频繁的,也是我们在这个程序中用到的三个方法简介如下:Accept()方法用于产生“阻塞(block)”,直到接受到一个连接请求,并且返回一个客户端的Socket对象实例。阻塞是一个术语,它使程序运行暂时停留在这个地方,直到一个会话产生,然后程序继续;我们通常用循环来产生“阻塞”。While(true) ServerSocket ss = new ServerSocket(intport); Socket socket = ss.accept();getInputStream()方法获得网络连接输入,同时返回一个IutputStream对象实例。Socket.getInputStream();getOutputStream()方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。Socket.getOutputStream();注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。在我们这里的程序中,把相关代码都摆到了try,catch语句块里。3.3.3 Java语言Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。(1) 简单性Java与C+语言非常相近,但Java比C+简单,它抛弃了C+中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。Like any human language, Java provides a way to express concepts. If successful, this medium of expression will be significantly easier and more flexible than the alternatives as problems grow larger and more complex.-摘自 Thinking in Java , 3rd EditionJava的自动垃圾回收机制有一个什么样的优点呢?记得我们以前用C来编写程序时,内存空间的开辟与回收都是由程序员自己实现的,这样就导致了一个问题:有些东西在该回收的时候被回收了。比方在PAUL的UML中讲过,aggregation与composition :一个大的对象可以由很多小的对象组成,比方写一个Car类,它的轮子可以生成Wheel类的实例(假设是wheel)来实现,但是如果wheel先于Car的对象(假定为car)被回收呢?这样car必然会出现异常。但这在JAVA中是不会发生的-因为JAVA的回收机制是采用自动形式的,不会出现这样的逻辑错误。(2) 面向对象Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。Java支持接口,接口允许程序员定义方法但又不立即实现,一个类可以实现多个接口,利用接口可以得到多重继承的许多优点而又没有多重继承的问题。The Java language assumes that you want to do only object-oriented programming. This means that before you can begin you must shift your mindset into an object-oriented world(unless its already there).The benefit of this initial effort is the ability to program in a language that is simpler to learn and to use than many other OOP languages.-摘自 Thinking in Java , 3rd EditionInterface不仅仅是一种“更纯”的abstract类,它还有更高一层的目的。由于interface不带任何“实现”也就是说interface与内存无关,因此谁也不会去阻饶interface之间的结合。这一点非常重要,因为有时你会遇到“x既是a,又是b,而且还是c”的情况。在C+中,这种将“多个类的接口结合在一起”的行为被称做”多重继承(multiple inheritance)”,但是由于每个类都有它自己的实现,而这会带来很多“甩都甩不掉”的问题。Java能让你做同样的事情,但是这时只有一个类有实现,因此当你合并接口的时候,就不会有这种问题了。Java并不强制你一定要去继承abstract还是具体的类(就是不带abstract方法的类),但你只能继承一个非abstract类(-单根继承)。所有别的基类元素都必须是接口(interface)。你得把所有接口名字放在implements的后面,用逗号分隔。可以根据需要实现多个接口,也可以将这个类上传至任何一个接口。-摘自 Java编程思想第三版(中文版)(3) 多线程多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。 Objects provide a way to divide a program into independent sections. Often, myou also need to turn a program into separate , independently running subtasks.Each of these independent subtasks is called a thread,and you program as if each thread runs by itself and has the CPU to itself.Some underlying mechanism is actually dividing up the CPU time for you,but in general,you donnot have to think about it,which makes programming with multiple threads a much easier task.-摘自 Thinking in Java , 3rd Edition线程是一个程序内部的顺序控制流。下图显示了Java线程的生命周期,由图,以便于我们理解线程是如何运行的。BORNREADYRUNNINGDEADSLEEPINGBLOCKEDWAITINGnewyield()运行notify()notifyAll()wait()sleep()complete()I/O操作睡眠时间到I/O操作完成图3-1 Java中线程的运行周期(4) 分布性Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。(5) 体系结构中立Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。l java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包l java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等l java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等l : 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口l java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等l java.applet: 支持applet程序设计的基本包(6) 安全性用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。我想我们班的同学肯定还记得上C语言的时候,李老师给我们举的那个例子:一个学生用指针写的那个“Hello”。Java中一切皆对象,但也有例外:出于性能的考虑,Java将基本数据类型照搬过来用,但也为它们实现了对象形式(Wrapper class)3.3.4 JAVA工具1. Java编译器Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为.java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。在JAVA中有个概念叫“包”,我们习惯在编写源文件的时候在最开头一行打个包,编译生成的类文件都放在这个包下,形式上看来其实就是API中的一个一个的类。2. Java解释器Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。3.3.5 客户机/服务器通信的实现-两端通过Socket机制进行连接:1. 客户端的编程流程:l 打开Socket,新建一个套接字;Socket socket = new Socket(Stringhost, intport)l 为套接字建立一个输入和输出流DataInputStream datainputstream= new DataInputStream(socket.getInputStream();DataOutputStream dataoutputstream= new dataOutputStream(socket.getOutputStream();l 根据服务器协议从套接字读入或向套接字写入;l 清除套接字和输入/输出流。2. 服务器端的编程流程:l 打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket 服务;l 使用ServerSocket类的accept()方法使服务器型套接字处于监听状态并把监听结果返回给普通套接字;l 为该普通套接字创建输入和输出流;l 从输入和输出流中读入或写入字节流,进行相应的处理,并将结果返回给客户端;l 在客户端和服务器工作结束后关闭所有的对象,如服务器型的套接字,普通套接字,输入和输出流。正是由于Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。关键点:实现 多个客户同时连接只有这样两个客户端与服务端其实是不够的。例如:在实际的应用中,同一时间只对一个用户服务是不可行的。一个优秀的网络服务程序除了能处理用户的输入信息,还必须能够同时响应多个客户端的连接请求。在java中,利用线程可以方便地实现这个要求。l 主程序监听一端口,等待客户接入;l 同时构造一个线程类,准备接管会话。l 当一个Socket会话产生后,将这个会话交给线程处理,l 然后主程序继续监听。实现方法:继承Thread类或实现Runnable接口。n Thread类使用线程的一种方法是继承Thread类。u 在继承了Thread类之后,要在这个新蕾中定义要执行的工作内容。工作的实际内容定义在Thread类所提供的run ( )方法内:u public abstract void run ( )u 定义好之后,就可以在需要的类内使用。使用的方法是建立一个新的Thread类,并调用Thread的start ( )方法以准备执行run ( )方法内的工作,例如:(MyThread为Thread的子类)u MyThread myThread = new MyThread ( );u myThread.start ( );u 除了start ( )与run ( )方法外,在Thread类中还定义了一些别的方法来处理线程的状态:u public static void yield ( )u 线程对象调用这个方法,可以让其它的线程有执行的机会。u public static void sleep ( long millis )u 等待一段时间(millis毫秒)之后再执行线程的内容。u public void join ( )u 等待其它的线程结束。n Runnable接口使用线程的另一个方法就是实现Runnable接口:public class MyThread implements Runnable 其操作方法同继承Thread类一样。关键细节阐述:服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。第四章 类的设计4.1 Java语法在程序中的体现n CanvasCanvas类提供paint(Graphics)方法,update()方法和注册keyPressed(int)、keyReleased(int)、keyRepeated(int)事件等监听器的方法,用于在Canvas中直接绘图和捕捉键盘事件。在paint(Graphics)方法中通过Graphics的绘图函数绘图。程序的Border类中在update()内调用paint(Graphics);public void update(Graphics g)paint(g);A Canvas component represents a blank rectangular area of the screen onto which the application can draw or from which the application can trap input events from the user. An application must subclass the Canvas class in order to get useful functionality such as creating a custom component. The paint method must be overridden in order to perform custom graphics on the canvas. -摘自 j2se apiCanvas类是一个抽象类,必须定义一个Canvas的子类,而且该子类必须至少实现其paint方法。n paintpublic void paint(Graphicsg)Paints this canvas. Most applications that subclass Canvas should override this method in order to perform some useful operation (typically, custom painting of the canvas). The default operation is simply to clear the canvas. Applications that override this method need not call super.paint(g). n updatepublic void update(Graphicsg)Updates this canvas. This method is called in response to a call to repaint. The canvas is first cleared by filling it with the background color, and then completely redrawn by calling this canvass paint method. Note: applications that override this method should either call super.update(g) or incorporate the functionality described above into their own code. -摘自 j2se apin ImageImage类用来表示图像文件,使用 Graphics. 对象的drawImage()方法可以绘制用于放置图象文件的ImagePanel面板程序中模拟QQ的表情功能,也定义了一组图片,用image类可以将图片文件包装成图片对象Everything is object-摘自 Thinking in Java , 3rd Editionn 布局管理器程序中还存在界面设计的问题,Java中有四大类布局管理器n BorderLayout在PrivateChat 类中,使用了BorderLayout,并在Center方位添加了组件。EmotionPanel.add(Center,EmotionScrollView); n FlowLayoutn GridLayout在InformationDialog类中使用了GridLayout :Panel ButtonPanel = new Panel(new GridLayout(7,2,15,30);其中的new GridLayout(7,2,15,30)传递了四个参数,分别代表的含义是行数,列数,水平间距,垂直间距。整条语句其实可以做如下分解:GridLayout gl = new GridLayout(7,2,15,30);LayoutManager lm = gl;Panel ButtonPanel = new Panel(lm);其构造器为:Panel(LayoutManagerlayout)同样:CardLayout也是如此public class CardLayout extends Object implements LayoutManager2, Serializable而LayoutManager2又继承了LayoutManager:public interface LayoutManager2 extends LayoutManagern CardLayout在BorderPanel类中使用了CardLayout(将其传入构造器),它能实现翻页性质的功能,前三种布局都是在一个页面上的,但CardLayout是对多个页面来说的,用CardLayout分页后。每页的布局里再使用前三种布局进行页面内管理。public BorderPanel(TapPanel tappanel, ChatClient app ,CardLayout cardlayout, Panel panel, int i, int j)xofs = 0;curTab = 0;Cframe = tappanel;cardLayout = cardlayout;.用show()的方法可以指定要到达的页面:parent.cardLayout.show(parent.cardPanel, s);n 隐藏实现在这个程序中,每个Java文件开头都有条语句package chatclient;它用于将当前文件编译后生成的类存放到一个统一的空间里去.我们先看看Java编程思想中是怎么解释包的概念的在面向对象的设计中,最关键的问题是“将会变的和不会变的东西分离开来”。这一点对类库尤为重要,类库使用者应该能完全仰赖类库,他们知道,即使出了新版本,他们也不必重写代码。类库的创建者也应该可以在不影响客户端程序员代码的前提下,保留对类库作修正和改进权利。Java提供访问控制符(access specifier)来解决这个问题。而且还提供了包(package)关键字来将组件捆绑成一个类库单元。类库就是一组类文件,每个文件都有一个public类,因此每个文件都代表一个组件,用package关键字就可以把这些组件组织起来。-摘自 Java编程思想第三版(中文版)(其实依照书上的说法,实际上package是由于名域(name space)而衍生的。我们大三的时候学的XML里也存在名域的概念。)n Static关键字在SocksSocket类中有这样一个声明:private static SocksSocketImngplFactory factory=null;它用到了Static关键字,在Thinking in Java中是这样解释Static的。通常创建类的时候,你只是在定义这类对象会长什么样子,会有什么行为。除非你用new创建一个那种类的对象,否则你什么也得不到。只有创建了对象,它才能分配到内存,方法也才能用。但是碰到下述两种情况的时候,这种做法就显得无能为力了。一是,无论你要创建多少对象,甚至不创建对象, 你都要有,且只要有一段保存某些数据的内存。另一种情况是,你要一个不从属于任何具体对象的方法。也就是说,你要一个即使没创建任何对象也能调用的方法。Static关键字能帮你达成以上两个目的。当你声明某样东西是Static的时候,你的意思是,这样数据没有被连到任何一个类的实例之上。因此即便你从来没有创建过那个类的实例,你也可以调用Static方法或Static数据。对于普通的数据和方法,你就只能先创建对象,再访问那个对象的属性和方法了。因为非Static的数据和方法必须知道它是属于哪个对象的。当然,由于Static方法不需创建就能使用,因此不能像普通方法调用一样,不说明对象的名字就直接访问他的非Static数据和方法了。-摘自 Java编程思想第三版(中文版)由此可知,我们将工厂对象定为静态,实际上就将它分配给了整个应用程序了,这个工厂对象只有一个实例。private static SocksSocketImngplFactory factory=null;它的实际意义为: 当程序创建一个新的client socket时,工厂对象就被调用去生成一个实际的socket实例。n toString()方法在SocksSocket类中使用了toString()方法,从字面意思来看,就是将某种不是字符串的东西转化成字符串。 Java编程思想中提到:所有非primitive对象都有toString()方法。 当编译器需要一个String 它却是个对象时,编译器就会自动调用这个方法,我们也可以模仿这个功能,在自己的类里也写一个toString()方法。在SocksSocket类中,覆盖了toString()方法,打印出来的是当前所需要信息public String toString()return SocksSocketaddr= + impl.getInetAddress() +,port= + impl.getPort() +,localaddr= +(impl.getLocalAddress()!=null?impl.getLocalAddress().toString():)+,localport= + impl.getLocalPort()+(impl.getProxyAddress()!=null?,proxyddr= + impl.getProxyAddress() +,proxyport= + impl.getProxyPort():)+;n StringBuffer在ChatClient中使用了StringBuffer:private void UpdateInformationLabel()stringbuffer = new StringBuffer();stringbuffer.append(用户名:);stringbuffer.append(UserName);stringbuffer.append( );stringbuffer.append(房间:);stringbuffer.append(UserRoom);stringbuffer.append( );stringbuffer.append(用户数:);stringbuffer.append(TotalUserCount);stringbuffer.append( );InformationLabel.setText(stringbuffer.toString();StringBuffer类似于String,但效率要高的多,比方把“hello”后面再附加一个“world”,构成“hello world”字符串,StringBuffer中有一个append()方法,可以把字符串直接添加到原字符串后面,而String则是要生成一个新的字符串,再把新字符串赋给原变量,开销太大。StringBuffer有个默认的容量,当字符串长度超过它的容量,会自动将空间加大。另外,StringBuffer还是线程安全的:String buffers are safe for use by multiple threads. The methods are synchronized where necessary so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved. -摘自 j2se apin ArrayList在EmotionCanvas类中在构造器中初始化了一个ArrayList,构造了一个EmotionCanvas(ChatClient Parent,PrivateChat ParentPrivate)chatclient = Parent;privatechat=ParentPrivate;dimension = size();IconArray = new ArrayList();An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.The List interface provides a special iterator, called a ListIterator。 -摘自 j2se apiArrayList实现了List接口, List接口是一个有序的集合,它可以对链中的元素进行精确的控制,用户可以通过索引访问链中的元素.还提供了一个遍历器,用于遍历链中的每个元素In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically.-摘自 j2se apiArrayList除了实现了List接口中的方法外,还提供了方法去操纵数组的大小,当有新元素添加进来后,它的容量自动增长.但它是线程不安全的,要实现线程安全,可用类似的Vector.二者的实现一模一样,唯一的不同就在于它是线程安全的.n Properties在这个程序中我们没有用到数据库,而是把用户登陆信息存在文件里,它也是持久化的一种表达方式.它用key-value的形式来保存数据.The Properties class represents a persistent set of properties. The Properties can be saved to a stream or loaded from a stream. Each key and its corresponding value in the property list is a string.-摘自 j2se api在initProperties()方法中,将所要信息如:用户名,密码等存入Properties,写入文件。private void initProperties(Properties properties)String value = properties.getProperty(SocksSocket

温馨提示

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

评论

0/150

提交评论