JAVA聊天室实验报告

时间:2019-05-15 09:43:14下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《JAVA聊天室实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《JAVA聊天室实验报告》。

第一篇:JAVA聊天室实验报告

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并未与数据库连接,只是简单的用文件保存用具信息及消息记录。

第二篇:java聊天室设计总结

JAVA聊天室程序设计总结

大二第一学期末我们进行了为期两周的java实习,这次的实习内容是设计一个多人聊天室。在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、MSN,网络聊天时一类的聊天系统的发展日新月异,因此老师布置了制作一个有简单聊天功能的网络聊天程序的课程;而且通过制作该程序还能更好的学习网络软件编程知识。

一、设计内容

利用java语言实现聊天室程序。聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务器端才可以实现正常的聊天功能。设计的聊天室能实现用户登录,显示登录用户列表,以及发送聊天信息和显示聊天信息的功能。并可以选择接收信息的用户进行单发或群发的功能,运行程序,登录服务器后,可以从列表中选择单个或多个用户进行聊天,它是图形界面,线程,流与文件系统等技术的综合应用。

二、实现功能

1、启动服务器端,接收客户端发来的信息,并在服务器端窗体显示客户端聊天信息,再吧信息返给在线用户。

2、启动客户端,进入客户端页面,输入用户名,点击登录按钮,在显示在线用户列表内显示用户名。

3、发送编辑框输入发送内容,单击发送按钮,启动输出流,把信息发送出去,同时把发出的信息追加到聊天内容文本域内,显示用户名,时间和发送内容。

4、聊天信息文本域,在线用户显示域和发送信息的文本域加了滚动条,其中聊天信息文本域,发送信息的文本域的文字能自动换行。

5、别的客户端发来信息是通过输入流读取信息,并截取发来信息的用户名及信息,用户名加到在线用户列表上显示在线,信息追加到聊天内容文本域内,显示用户名,时间和发送内容。

三、设计收获

这是大学以来第一次自主设计一个聊天程序,于我来说还是很有新鲜感但同时也有着稍许担心。通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,但经过一次又一次的思考,一遍又一遍的检查和在老师、同学们的帮助下,慢慢的走上了成功之路,同时也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。这次课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。让我不仅学会了书本上的知识,还让自己能够面对困难并且克服它使我更加扎实的掌握了有关JAVA方面的知识。过而能改,善莫大焉。在聊天室设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。程序虽然完成,但是距离优秀仍存在一定差距,用JAVA开发大型项目还有很多我需要去努力学习的知识。希望自己能不断学习和实践,争取以后做得更好。

第三篇:java聊天室课程设计报告

课程设计报告

2011 ~ 2012 学年 第 一 学期

学 号 20104053020 姓 名 胡勇昌 院 系 信息工程与技术 专 业 计算机工程系 课 程 名 称 JAVA程序设计 课程设计名称 局域网内的多功能聊天室

学 时 学 分 1 指 导 教 师 许烁娜

2011年 12 月 25 日

目录

课程设计报告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相关技术.......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 术语...............................................................................................................................................4 第2章 需求分析与系统设计................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系统设计.......................................................................................................................................6 2.2.1多用户在线方案.....................................................................................................................6 2.2.2 系统功能................................................................................................................................6 第3章 系统实施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客户端窗口...........................................................................................................................8 3.3 内嵌“私聊”窗口.......................................................................................................................9 3.4客服端类继承客户端窗口类,并内嵌私聊程序......................................................................10 第4章 测试..........................................................................................................................................15 4.1 测试环境与使用方法.................................................................................................................15 4.2 功能测试.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客户端窗口..........................................................................................................................16

4.2.3 内嵌“私聊”窗口..........................................................................................................................16

参考文献................................................................................................................................................16

第1章 引言

1.1 背景

网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。聊天室可以建立在即时通讯软件(如MSN Messenger、QQ)、P2P软件、万维网(如 Halapo,Meebo)等基础上,万维网方式更为普通和种类繁多,交谈的手段不局限于文本,更包括语音、视频。通常聊天室是按照房间或频道为单位的,在同一房间或频道的网人可以实时地广播和阅读公开消息。一般情况下,与其它网络论坛、即时通讯不同的是,聊天室不保存聊天记录。

1.2 相关技术 1.2.1 JAVA概述

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

1.2.2 Socket Socket是java中需一要编写较低层次的网络通信程序(例如Cljent/server应用程序)时提供的一种通讯机制。Socket是两个程序进行双向数据传输的网络通信的端点,一般 由一个地址加上一个端口号来标一识。每个服务程序都在一个众所周知的端口上提供服 务,而想使用服务的客户端程序则需要连接该端口。通过Socket的数据是原始字节流信 息,通信双方必须根据约定的协议对数据进行处理与解释。

Socket通信机制提供了两种通信.方式:有连接方式(TCP)和无连接方式(UDP数

据报)。有连接方式中,通信双方在开始时必须进行一次连接过程,建立一条通信链路。通信链路提供了可靠的,全双工的字节流服务。无连接力一式中,通信双方不存在一个连 接过程,一次网络I/O以一个数据报形式进行,而每次网络I /O可以和不同.主机的不 同进程进行。无连接方式开销小于有连接方式,但是所提供的数据传输服务不可靠,不 能保证数据报一定到达目的地”」·。

JAVA的有连接通信采用流式I/O模式。Socket是两个进程间通信链的端点,每个 Sockct有两个流:一个输入流和一个输出流。只要向Sockct的输出流写,一个进程就可 以通过网络连接向其他进程发送数据;同样,通过读Sockt的输入流,就可以读取传输 来的数据。

有连接通信一般要经历以下四个基本步骤ii

(1)创建Sockct,建立连接;

(2)打开连接到Sockct的输入/输出流;

(3)按照一定的一脚议对Socket进行读/写操作;

(4)关闭Socket。

第(3)步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种 程序中基本相同。

1.2.3 TCP 三次握手

TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。

1.3 术语

暂无

第2章 需求分析与系统设计

2.1 需求分析

从技术发面来看,Java语言的优点一要表现在:简.单、面向对象、多线程、安全性 等方面。1.简单性

Java与C++语言灰常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对 必要的功能,如头文件、顶处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。Java实现了自动的垃圾收集,简化了内存管理的一作。这使程序一设计更加简便,同时减少了出错的可能。2.面向对象

Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的一方法,从而既实现了代码的复用,又提供了一种动态的解决方案。

Java是一种完全面向对象的程序设计语一言,它除了数组、布尔和字符二个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。

Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的 单重继承,即每个类只能从一个类中继承。

Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。3.多线程

多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容.易实现网络上的实时交互操作。

Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线 程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。4.安全性

Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。2.2 系统设计 2.2.1多用户在线方案 2.2.2 系统功能

聊天室程序通常需要完成以下一些基本功能:

(I)登录聊天室;

(2)启动服务器;

(3)关闭服务器;

(4)用户之间的聊天;

(5)退出聊天室。

本系统其体功能需求如下:

(1)聊天室管理员经登录界面登录到管理界而,即系统的服务器端。用户经登录界而 都进入聊天大厅。

(2)不论是管理员还是用户都需一要在登录界面输入正确的用户名和密码后才可以登录 到各自的界面中去。

(3)系统的两个主要界面都是为方便管理员和用户操作的。首先,管理员进入到管理 界而后可以方便的启动/停止服务器,看到在线用户的信息和聊人信息、。用户进入到聊天 大厅中可以聊天,查看服务器状态。

(4)一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户端的连接则所有的用户都失去与服务器的连接。

(5)用户的聊天信息录入,重写,发送,接收方便,快捷。

(6)服务器状态,聊天信息和在线用户人数及时刷新。

(7)聊天室系统运行稳定、安全性高、性能可靠。

第3章 系统实施

3.1聊天室窗口

建立服务端窗口类:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;

import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;

public class chatroomW { JFrame f=new JFrame(“局域网聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“发送”);Button button1=new Button(“启动服务”);Button button2=new Button(“发送”);Button button3=new Button(“刷新用户列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){

chat();} public void chat(){

area1.setBackground(new Color(204,255,255));

area1.setForeground(Color.black);

userList.setBackground(Color.gray);

userList.setForeground(Color.white);

f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);

f.setBounds(300,200,750,485);

f.setResizable(false);

f.setVisible(true);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

area1.setEditable(false);text1.setText(“10000”);

myEvent();

} public static void main(String args[]){

new chatroomW();} public void myEvent(){} }

3.2 建立客户端窗口

import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;

import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;

public class ClientW {

JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“连接”);JButton button2=new JButton(“发送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服务器地址”);JLabel label2=new JLabel(“服务器端口”);JLabel label3=new JLabel(“昵称”);public ClientW(){ } public void chat(){

area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//

}

} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();

3.3 内嵌“私聊”窗口

class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;

f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//设置窗口大小和位置; label1=new JLabel(“对方主机”);label2=new JLabel(“本地端口”);label3=new JLabel(“对方端口”);button1=new Button(“连接”);button2=new Button(“发送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//让窗口大小固定;

// 闭;

} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//关闭窗口程序同时关myEvent();

3.4客服端类继承客户端窗口类,并内嵌私聊程序

import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;

import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;

public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){

button1.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

try{

s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));

new Thread(new LinkC()).start();

area.append(“[系统消息]:连接成功n”);

}catch(Exception ex){area.append(“[系统消息]:连接失败n”);}

}

});

button2.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

new SentC();

}

});

button3.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

new netchat();

}

});} public static void main(String args[]){

new Client();}

class LinkC implements Runnable{

public void run(){

try{

BufferedReader bufIn=

new BufferedReader(new InputStreamReader(s.getInputStream()));

String msg=null;

PrintStream ps=new PrintStream(s.getOutputStream());

ps.println(text3.getText());

while(true){

try{

while((msg=bufIn.readLine())!=null){

area.append(msg+“n”);

}

}catch(Exception ex){break;}

}

}catch(Exception e){}

}

}

class SentC {

public SentC(){

try{

PrintStream ps=new PrintStream(s.getOutputStream());

if(!text4.getText().equals(“")){

ps.println(text4.getText());//

area.append(text4.getText());//服务器自动会返回

text4.setText(”“);

}

}catch(Exception e){}

}

} //私聊类

class netchat{

JFrame f=new JFrame(”私聊“);

JLabel label1,label2,label3;

Button button1,button2;

JTextField text1,text2,text3,text4;

TextArea textarea;

public netchat(){

f.setLayout(new FlowLayout());

f.setBounds(300,200,400,310);

//设置窗口大小和位置;

f.setResizable(false);

//让窗口大小固定;

label1=new JLabel(”对方主机“);

label2=new JLabel(”本地端口“);

label3=new JLabel(”对方端口“);

button1=new Button(”连接“);

button2=new Button(”发送“);

text1=new JTextField(7);

text2=new JTextField(3);

text3=new JTextField(3);

text4=new JTextField(20);

textarea=new TextArea(13,53);

textarea.setEditable(false);

textarea.setBackground(new Color(204,250,255));

text2.setText(”10000“);

text3.setText(”10000“);

f.add(label1);

f.add(text1);

f.add(label2);

f.add(text2);

f.add(label3);

f.add(text3);

f.add(button1);

f.add(textarea);

f.add(text4);

f.add(button2);

f.setVisible(true);//

f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//关闭窗口程序同时关闭;

myEvent();

}

public void myEvent(){

f.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e){

try{

DatagramSocket ds=new DatagramSocket();

byte[] buf=”对方已下线“.getBytes();

DatagramPacket dp=

new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));

ds.send(dp);

ds.close();

}catch(Exception ex){}

}

});

button2.addActionListener(new ActionListener()//事件源是button2

{

public void actionPerformed(ActionEvent e)

{

if(!text4.getText().equals(”“))

new Thread(new Send()).start();

}

});

button1.addActionListener(new ActionListener()//事件源是button1

{

public void actionPerformed(ActionEvent e)

{

new Thread(new Rece()).start();

}

});

}

class Send implements Runnable{

public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系统消息]:发送失败n“);}}

public void UdpSend()throws Exception{

DatagramSocket ds=new DatagramSocket();

byte[] buf=text4.getText().getBytes();

DatagramPacket dp=

new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));

textarea.append(”[我]: “+text4.getText()+”n“);

text4.setText(”“);

ds.send(dp);

ds.close();

}

}

class Rece implements Runnable{

int index=0;

public void run(){

try{

UdpRece();

}catch(Exception e){

textarea.append(”[系统消息]:连接失败n“);

}

}

public void UdpRece()throws Exception{

while(true){

DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));

if(index==0){textarea.append(”[系统消息]:连接成功n“);}

byte[] buf=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf,buf.length);

ds.receive(dp);

String data=new String(dp.getData(),0,dp.getLength());

textarea.append(dp.getAddress()+” “+data+”n");

index++;

ds.close();

}

}

}

} } 第4章 测试

4.1 测试环境与使用方法

测试环境:测试环境:电脑安装Java JDK 服务器端使用方法:打开服务启动,点击“启动服务”,提示“启动服务成功”表示正常启动。否则,先关闭服务端,再重新打开,启动服务。客户端使用方法:打开客户端,输入“服务器地址”,点击“连接”,如成功连接系统提示“成功连接”,并收到服务端返回的“欢迎”信息,否则关闭并重新启动。

私聊功能使用方法:点击面板上的“私聊”按钮,输入对方的IP地址,点击连接,如连接成功系统会提示“连接成功”。当对方断开时会收到“对方已下线”提示。如果要同时跟多人私聊,则要改变本地端口值,并告知对方。

4.2 功能测试 4.2.1聊天室窗口

4.2.2 客户端窗口

4.2.3 内嵌“私聊”窗口

参考文献

用JAVA程序实现参考文献的录入与生成 刘玮玮 2009 《福建电脑》

基于Java移动Agent系统的安全参考模型 周屹 2007 《黑龙江工程学院学报》

嵌入式Java虚拟机的性能优化技术 李允 2004 《计算机工程》

第四篇:java局域聊天室实践总结

河北科技师范学院

JAVA程序设计课程设计

个人实习总结

实习类型 课程设计 实习单位 指导教师 所在院(系)信息技术系 班 级 姓 名 学

_

一、实习时间和地点

时间:2015.3.17-2015.4.14 地点:F310、F311

二、实习的内容

我所开发的系统是:局域网聊天系统。系统功能简要说明如下:

该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。

1、服务器:负责处理各个客户端的信息,并负责将信息进行转发。①服务器主要负责响应客户端的的各种信息,包括链接服务器,用户信息发送,各个客户端的信息相互转发。②服务器的实现有Server类,Server类主要是进行初始化的工作

2、客户端:用户使用界面,负责接受信息以及与服务器进行通信。①客户端负责为用户提供聊天界面,将信息发送至服务器,接受服务器的反馈信息等一系列的工作。②客户端的实现有Client类,Client类负责与服务器,其它客户端进行通信。

1.连接:点击“连接”按钮之后将信息发送到服务器端,服务器端创建相应的连接,并将更新后的用户列表发送给所有用户。2.发送:根据发送者、发送对象、发送的话创建一个字段发送到服务器端。3.清空:清空客户端接收信息聊天对话框。4.私聊TA:选择在线主机ip,根据ip地址发送一个私密聊天请求到服务器,服务器选择相

应的地址进行信息发送。本程序可以有多个用户,只需在一台服务器上运行服务端程序,所有的用户连接上了之后就可以正常通信。

人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。因此我们这个聊天室选择了简洁的界面搭建。因为之前学过JFrame类的使用,所以界面搭建部分代码如下:

public class TCPClient extends JFrame {

public static String olip;private static final long serialVersionUID = 1L;JTextArea jtaContent = new JTextArea();JTextField jtaInstant = new JTextField();JButton jbSend = new JButton(“发送”);JButton jbConnect = new JButton(“连接”);JButton jbClear = new JButton(“清空”);JLabel jlTip=new JLabel(“在线主机”);JButton jbPChat=new JButton(“私聊TA”);JPanel jpBtns = new JPanel();JPanel jpContact=new JPanel();jtaContent.setEditable(false);jpBtns.setLayout(new GridLayout(1, 3, 5, 5));jpBtns.add(jbConnect);jpBtns.add(jbSend);jpBtns.add(jbClear);jpBtns.setBounds(0, 375, 350, 30);JScrollPane jspText=new JScrollPane(jtaInstant);jspText.setBounds(0, 310, 350, 65);JScrollPane jspContactOL=new JScrollPane(jcbContact);JScrollPane jspContent=new JScrollPane(jtaContent);jspContent.setBounds(0, 0, 350, 300);jpContact.setLayout(new GridLayout(5, 5, 1, 3));jpContact.add(jlTip);jpContact.add(jspContactOL);jpContact.add(jbPChat);jpContact.setBounds(350, 0, 135, 220);public void launchFrame(){

add(jpContact);add(jpBtns);add(jspText);add(jspContent);setLayout(null);setSize(500, 450);setLocation(100, 100);setTitle(“Chat Client”);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);由于本人学习的java不是特别扎实,所以界面的设计代码经过参考反复实验才达到要求。界面完成后才发现真正的挑战刚刚开始。我们需要得到本机ip地址并传送至服务器,部分代码如下:

InetAddress

myIP;myIP=InetAddress.getLocalHost();s = new Socket(myIP.getHostAddress(), 9402);然后我们发送IP地址,其他客户端收到此地址时会判别,判别为IP地址,其它客户端会将这一IP地址规划为在线用户:

InetAddressmyIP;myIP=InetAddress.getLocalHost();strIP=myIP.getHostAddress();dos.writeUTF(“a”+strIP);我们还设计了一个私聊功能,所以就需要实现事件的监听: Timer tm1=newTimer(1000,newActionListener(){ @Override public voidactionPerformed(ActionEvent e){ tm3.stop();jbPChat.setText(“通知”);tm2.start();}});Timer tm2=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm1.stop();jbPChat.setText(“有私聊消息”);tm3.start();}});

Timer tm3=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm2.stop();jbPChat.setText(“请查收”);tm1.start();}});这样,当有私聊信息请求传送过来时通过这些提醒就可以实现私聊功能。起初我们有这些功能的想法,觉得通过网络书籍能够很方便的查找到。可是实际操作实验中遇到了不少困难。比如这个私聊功能的实现。刚开始连接成功后选择私聊对象,我们决定以IP地址为依据。加入选择IP地址功能后点击私聊,发现客户端可以收到私聊提示,可是却收不到具体的文字信息。为此我们查找了大量信息,终于成功的实现了私聊功能。

后来我想,能不能让服务器端连接数据库。在客户端设置一个注册界面,让用户更具体化,这样识别身份时就不用再使用IP地址。客户端用户的注册信息会保存在数据库里,下次登录客户端就用属于个人的ID和密码。首先要实现用户的注册:

public void register(){ String strServerIp = txtHost.getText();String strServerPort=txtPort.getText();this.dispose();new Register(strServerIp,strServerPort);然后向服务器端发送“注册”的命令。服务器处理接收到的命令为“注册”时调用函数,合法注册后,向客户端发送“注册成功”的消息,并断开连接。由于时间关系,数据库未能完成,希望下次有机会可以完善。

三、心得体会

1.成绩与收获

这次软件开发让我学到了很多知识。只是只有转变成实际而有用的东西才能显现出它的价值。学习不只是学习理论只是,更重要的是自己的动手操作能力。这个软件工程的项目实战让我真切感受到软件开发的全过程,这让我明白软件的开发是一门艺术,而不是代码的简单叠加。这需要一个小组的共同努力。这次开发让我跟深入的去思考了一个软件的构成与实现。以前用通讯软件是从未思考过如何实现它的功能,等自己来做是才发现里面要考虑的东西很多。在实践中,我也学到了很多java编程方面的知识。2.问题与不足

由于java编程运用的不是特别熟练,加上时间问题,我们的程序还有很多不尽

如人意的地方。例如:很多功能没有实现(语音视频,文件传输,个人信息等等),并且界面比较粗糙。这些都是以后需要努力的地方。水平所限,致使程序实现的功能在方法上也许不是很完美,但我以后会多向老师请教,自己也要加强对java的学习。努力进一步提高自己的编程水平。

第五篇:JAVA课程设计之简单聊天室

课程设计报告

课程名称 课程代码 题

目 年级/专业/班 学生姓名 学

号 指导老师 开题时间 完成时间 Java程序设计

简单聊天室

孟青 09308910203

I

: : : : : : : : :

摘要..............................................................................................................................................................I 1 引言...........................................................................................................................................................1 2 设计任务与目的.......................................................................................................................................1 3 需求分析...................................................................................................................................................1 3.1 系统用例图............................................................................................................................1 3.2 主要用例分析........................................................................................................................2 4 系统设计.................................................................................................................................................3 4.1 总体设计........................................................................................................................................3 4.1.1 系统类图.............................................................................................................................3 4.1.2 主要时序图.........................................................................................................................6 4.2 详细设计........................................................................................................................................8 4.2.1 ChatServer类......................................................................................................................9 4.2.2 ServerListen类..................................................................................................................10 4.2.3 ServerReceive类...............................................................................................................10 4.2.4 PortConf类.......................................................................................................................11 4.2.5 Help类..............................................................................................................................11 4.2.6 UserLinkList类.................................................................................................................11 4.2.7 Node类.............................................................................................................................12 4.2.8 ChatClient类.....................................................................................................................13 4.2.9 ConnectConf类.................................................................................................................15 4.2.10 UserConf类....................................................................................................................15 4.2.11 Help类............................................................................................................................16 4.2.12 ClientReceive类.............................................................................................................16 5 系统实现.................................................................................................................................................16 5.1 系统主要用例的实现..................................................................................................................16 5.1.1 聊天室服务端用例运行效果...........................................................................................17 5.1.2 聊天室客户端用例运行效果...........................................................................................18 5.2 系统发布与运行..........................................................................................................................18 5.2.1 系统打包...........................................................................................................................18 5.2.2 系统发布与运行...............................................................................................................18 6 结束语.....................................................................................................................................................19 参考文献.......................................................................................................................................................19 致谢...............................................................................................................................................................19 附录A:系统源程序...................................................................................................................................20

1、ChatServer类..........................................................................................................................20

2、ServerListen类.......................................................................................................................31

3、ServerReceive类.....................................................................................................................32

4、UserLinkList类.......................................................................................................................36

5、Node类...................................................................................................................................39

I

6、PortConf类.............................................................................................................................40

7、Help类....................................................................................................................................42

8、ChatClient类...........................................................................................................................44

9、ClientReceive类.....................................................................................................................56

10、ConnectConf类.....................................................................................................................58

11、UserConf类...........................................................................................................................61

12、Help类..................................................................................................................................63 附录B:编码规范.......................................................................................................................................66

II

摘要

本课程设计我们通过聊天室的代码实现,体会到将理论知识与具体实现相结合,巩固Java相关方法。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。

关键词:(3-5个,每个之间用分号隔开)聊天室;多线程;C/S模式

Abstract

The course design our chat room through the code, understand the theoretical knowledge and practical realization of the combination, the consolidation of java-related methods.Chat client and the server is divided into two parts, the client, server-side program is mainly responsible for listening client sent the news to be landing the client to the server will be realized only if the normal chat.The chat system to exchange-based chat, in order to provide customers with a network platform for interpersonal communication, but also network with the reality of the practical is the closest site.Key words: Chat rooms, multi-threaded, C / S mode I

简单聊天室 引言

随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,且具有脱离数据库技术方法,易于维护和更新的特点。设计任务与目的

本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。

通过本项目的设计实践,力求熟练掌握GUI程序设计、多线程技术、基于TCP的Socket通信编程。需求分析

本系统所要实现的主要功能是为广大用户提供一个借助网络进行人际交往的平台。因为服务端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用TCP协议进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。

3.1 系统用例图

图3-1 系统用例图

3.2 主要用例分析 服务器端的主要功能如下:

1,在特定端口上进行侦听,等待客户端连接

2,用户可以配置服务端的侦听端口,默认端口为8888.3,向已经连接到服务端的用户发送系统消息。4,统计在线人数

5,当停止服务时,断开所有的用户连接。客户端的主要功能如下:

1,连接到已经开启的聊天服务的服务端。

2,用户可以配置要连接服务器端的IP地址和端口号。3,用户可以配置连接后显示的用户名。

4,当服务器端开启的时候,用户可以随时登录和注销。5,用户可以向所有人或者某一个人发送消息。

系统设计 4.1 总体设计

4.1.1 系统类图

图4-1-1 服务端系统类图

图4-1-2 客户端系统类图

4.1.2 主要时序图

图4-2-1 服务端主要时序类图

图4-2-2 客户端主要时序类图

4.2 详细设计

聊天室服务器端的设计

聊天室服务端主要包括7个类,放在server包中:

4.2.1 ChatServer类

图4-3 ChatServer类图

ChatServer.java 包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间

监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。

4.2.2 ServerListen类

图4-4 ServerListen类图

ServerListen.java 该类实现服务器用户上线与下线的监听。该类对用户上线下线的监听是通过调用用户链表类(UserLinkList)来实现的。当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。

4.2.3 ServerReceive类

图4-5 ServerReceive类图

ServerReceive.java 该类是实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的街面上。

4.2.4 PortConf类

图4-6 PortConf类图

PortConf.java

该类继承自Jdialog,是用户对服务器端监听端口进行修改配置的类。

4.2.5 Help类

图4-7 Help类图

Help.java

服务端程序帮助类。

4.2.6 UserLinkList类

图4-8 UserLinkList类图

UserLinkList.java

用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。

4.2.7 Node类

图4-9 Node类图

Node.java 用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。聊天室客户端设计

聊天室客户端主要包括5个类,放在client包中:

4.2.8 ChatClient类

图4-10 ChatClient类图

ChatClient.java 包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理。该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话。

4.2.9 ConnectConf类

图4-11 ConnectConf类图

ConnectConf.java 该类继承自Jdialog,是用户对所有要连接的服务器IP及监听端口进行修改配置的类。

4.2.10 UserConf类

图4-12 UserConf类图

UserConf.java

该类继承自Jdialog,是用户对链接到服务器时所显示的用户名进行修改配置的类。

4.2.11 Help类

图4-13 Help类图

Help.java 客户端程序的帮助类。

4.2.12 ClientReceive类

图4-14 ClientReceive类图

ClientReceive.java 该类是实现服务器端与客户端消息收发的类。系统实现

5.1 系统主要用例的实现

5.1.1 聊天室服务端用例运行效果

图5-1 聊天室服务端用例运行效果图

5.1.2 聊天室客户端用例运行效果

图5-2 聊天室客户端用例运行效果图

5.2 系统发布与运行

5.2.1 系统打包

使用MyEclipse自带的打包工具分别将server包和client包中的.class文件打成两个Jar包:ChatServer.jar和CharClient.jar。

5.2.2 系统发布与运行

将server包和client包中的.class文件打成两个Jar包,就可以发布系统了。直接分别双击两个Jar包(ChatServer.jar和CharClient.jar),就可以运行服务端和客户端了。

结束语

Java面向对象程序设计是一门应用广泛并且实用性极强的高级程序设计语言。通过本次课程设计,我们对面向对象的基本思想有了进一步的理解,对项目的各个阶段的任务也有了一定的了解。设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。通过这次设计,使我们认识到体系的架构是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的的实现。

通过这次课程设计,对我们的逻辑思维能力是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但是我们学到了丰富的知识。

另外,此次课程设计也提高了我们的团对合作精神,让我们明白不是不能一个人能单独完成,而是要集思广益,结合更多的人的创意思维。让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。对于不同的想法我们都会集中讨论并对好的意见加以借鉴,在这个讨论的过程中,还更正了不少我们各自自身对于某个知识点的误区。

这次程序设计也是一个毅力的考验过程。有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。所以在这个过程不能过于急躁,要很有耐心将程序反复调试,参考文献

[1] 张广彬,孟红蕊,张永宝.Java课程设计案例精编[M].北京:清华大学出版社,2007,1.[2] 黄晓东.Java课程设计案例精编[M].北京:中国水利水电出版社,2004,5.[3] 求是科技.Java信息管理系统开发实例导航[M].北京:人民邮电出版社,2005,4.[4] 求是科技.Java数据库系统开发实例导航[M].北京:人民邮电出版社,2004,9.[5]廖卫东Java程序设计实用指南[M].北京:机械工业出版社,2002.1[3] [6]李卫华,傅晓东.Java语言基础及其应用[M]北京:中国水利水电出版社,1996[5]

致谢

本次课程由上海杰普公司三为指导老师以及我们任课老师郭老师精心辅导,让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。使我们对java有了更深刻的认识,产生浓厚的学习兴趣。我们由衷对他们表示感谢。

附录A:系统源程序

1、ChatServer类

功能:为定义服务器端的界面,添加时间监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。代码:

package server;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;/* * 聊天服务端的主框架类 */ public class ChatServer extends JFrame implements ActionListener{

/** * */ private static final long serialVersionUID = 1L;

public static int port = 8888;//服务端的侦听端口

ServerSocket serverSocket;//服务端Socket JComboBox combobox;//选择发送消息的接受者

JTextArea messageShow;//服务端的信息显示

JScrollPane messageScrollPane;//信息显示的滚动条

JTextField showStatus;//显示用户连接状态

JLabel sendToLabel,messageLabel;JTextField sysMessage;//服务端消息的发送

JButton sysMessageButton;//服务端消息的发送按钮

UserLinkList userLinkList;//用户链表

//建立菜单栏

JMenuBar jMenuBar = new JMenuBar();//建立菜单组

JMenu serviceMenu = new JMenu(“服务(V)”);//建立菜单项

JMenuItem portItem = new JMenuItem(“端口设置(P)”);JMenuItem startItem = new JMenuItem(“启动服务(S)”);

JMenuItem stopItem=new JMenuItem(“停止服务(T)”);JMenuItem exitItem=new JMenuItem(“退出(X)”);

JMenu helpMenu=new JMenu(“帮助(H)”);JMenuItem helpItem=new JMenuItem(“帮助(H)”);//建立工具栏

JToolBar toolBar = new JToolBar();//建立工具栏中的按钮组件

JButton portSet;//启动服务端侦听 JButton startServer;//启动服务端侦听 JButton stopServer;//关闭服务端侦听 JButton exitButton;//退出按钮

//框架的大小

Dimension faceSize = new Dimension(400, 600);

ServerListen listenThread;JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;/** * 服务端构造函数 */ public ChatServer(){ init();//初始化程序

//添加框架的关闭事件处理

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//设置框架的大小

this.setSize(faceSize);//设置运行时窗口的位置

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(“聊天室服务端”);//设置标题

setVisible(true);

//为服务菜单栏设置热键'V'

serviceMenu.setMnemonic('V');

//为端口设置快捷键为ctrl+p

portItem.setMnemonic('P');

portItem.setAccelerator(KeyEvent.VK_P,InputEvent.CTRL_MASK));

//为启动服务快捷键为ctrl+s

startItem.setMnemonic('S');

startItem.setAccelerator(KeyEvent.VK_S,InputEvent.CTRL_MASK));

//为端口设置快捷键为ctrl+T

stopItem.setMnemonic('T');

stopItem.setAccelerator(KeyEvent.VK_T,InputEvent.CTRL_MASK));

//为退出设置快捷键为ctrl+x

exitItem.setMnemonic('X');

exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));

//为帮助菜单栏设置热键'H'

helpMenu.setMnemonic('H');

//为帮助设置快捷键为ctrl+p

helpItem.setMnemonic('H');

helpItem.setAccelerator(KeyEvent.VK_H,InputEvent.CTRL_MASK));

}

/** * 程序初始化函数

*/ public void init(){

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

(KeyStroke.getKeyStroke

(KeyStroke.getKeyStroke

(KeyStroke.getKeyStroke

(KeyStroke.getKeyStroke

(KeyStroke.getKeyStroke

//添加菜单栏

serviceMenu.add(portItem);serviceMenu.add(startItem);serviceMenu.add(stopItem);serviceMenu.add(exitItem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//初始化按钮

portSet = new JButton(“端口设置”);startServer = new JButton(“启动服务”);stopServer = new JButton(“停止服务”);exitButton = new JButton(“退出”);//将按钮添加到工具栏 toolBar.add(portSet);toolBar.addSeparator();//添加分隔栏 toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);//初始时,令停止服务按钮不可用 stopServer.setEnabled(false);stopItem.setEnabled(false);//为菜单栏添加事件监听

portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);

//添加按钮的事件侦听

portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);

combobox = new JComboBox();combobox.insertItemAt(“所有人”,0);combobox.setSelectedIndex(0);23

messageShow = new JTextArea();messageShow.setEditable(false);//添加滚动条

messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400));messageScrollPane.revalidate();

showStatus = new JTextField(35);showStatus.setEditable(false);

sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(“发送”);//添加系统消息的事件侦听

sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(“发送至:”);messageLabel = new JLabel(“发送消息:”);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel(“ ”);girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;24

girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);

//关闭程序时的操作

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

stopService();25

}

System.exit(0);

} });/** * 事件处理 */ public void actionPerformed(ActionEvent e){ Object obj = e.getSource();if(obj == startServer || obj == startItem){ //启动服务端

startService();} else if(obj == stopServer || obj == stopItem){ //停止服务端

int j=JOptionPane.showConfirmDialog(this,“真的停止服务吗?”,“停止服务”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if(j == JOptionPane.YES_OPTION){

stopService();

} } else if(obj == portSet || obj == portItem){ //端口设置

//调出端口设置的对话框

PortConf portConf = new PortConf(this);

portConf.setVisible(true);} else if(obj == exitButton || obj == exitItem){ //退出程序

int j=JOptionPane.showConfirmDialog(this,“真的要退出吗?”,“退出”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if(j == JOptionPane.YES_OPTION){

stopService();

System.exit(0);

} } else if(obj == helpItem){ //菜单栏中的帮助

//调出帮助对话框

Help helpDialog = new Help(this);

helpDialog.setVisible(true);} else if(obj == sysMessage || obj == sysMessageButton){ //发送系统消息

sendSystemMessage();} } /** * 启动服务端 */ public void startService(){ try{

serverSocket = new ServerSocket(port,10);

messageShow.append(“服务端已经启动,在”+port+“端口侦听...n”);

startServer.setEnabled(false);

startItem.setEnabled(false);

portSet.setEnabled(false);

portItem.setEnabled(false);

stopServer.setEnabled(true);

stopItem.setEnabled(true);

sysMessage.setEnabled(true);} catch(Exception e){

//System.out.println(e);} userLinkList = new UserLinkList();

listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();} /** * 关闭服务端 */ public void stopService(){ try{

//向所有人发送服务器关闭的消息

sendStopToAll();

listenThread.isStop = true;

serverSocket.close();

int count = userLinkList.getCount();

int i =0;27

while(i < count){ Node node = userLinkList.findUser(i);

node.input.close();node.output.close();node.socket.close();

i ++;} stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(“服务端已经关闭n”);

combobox.removeAllItems();

combobox.addItem(“所有人”);} catch(Exception e){

//System.out.println(e);} } /** * 向所有人发送服务器关闭的消息 */ public void sendStopToAll(){ int count = userLinkList.getCount();

int i = 0;while(i < count){

Node node = userLinkList.findUser(i);

if(node == null){

i ++;

continue;

}

try{

node.output.writeObject(“服务关闭”);28

node.output.flush();

}

catch(Exception e){

//System.out.println(“$$$”+e);

}

i++;} } /** * 向所有人发送消息 */ public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用户总数

int i = 0;while(i < count){

Node node = userLinkList.findUser(i);

if(node == null){

i ++;

continue;

}

try{

node.output.writeObject(“系统信息”);

node.output.flush();

node.output.writeObject(msg);

node.output.flush();

}

catch(Exception e){

//System.out.println(“@@@”+e);

}

i++;} sysMessage.setText(“");} /** * 向客户端用户发送消息 */ public void sendSystemMessage(){ 29

} String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText()+ ”n“;

messageShow.append(message);

//向所有人发送消息

if(toSomebody.equalsIgnoreCase(”所有人“)){ sendMsgToAll(message);} else{ //向某个用户发送消息

Node node = userLinkList.findUser(toSomebody);

try{

node.output.writeObject(”系统信息“);

node.output.flush();

node.output.writeObject(message);

node.output.flush();} catch(Exception e){

//System.out.println(”!!“+e);} sysMessage.setText(”“);//将发送消息栏的消息清空 } public static void main(String[] args){ try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch(ClassNotFoundException e){

// TODO Auto-generated catch block

e.printStackTrace();} catch(InstantiationException e){

// TODO Auto-generated catch block

e.printStackTrace();} catch(IllegalAccessException e){

// TODO Auto-generated catch block

e.printStackTrace();} catch(UnsupportedLookAndFeelException e){

// TODO Auto-generated catch block

e.printStackTrace();} new ChatServer();} 30

}

2、ServerListen类

功能:实现服务器用户上线与下线的监听。该类对用户上线下线的监听是通过调用用户链表类(UserLinkList)来实现的。当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。

代码:

package server;

import javax.swing.*;import java.io.*;import java.net.*;/* * 服务端的侦听类 */ public class ServerListen extends Thread { ServerSocket server;

JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用户链表

Node client;ServerReceive recvThread;

public boolean isStop;

/* * 聊天服务端的用户上线于下线侦听类

*/ public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){

this.server = server;

this.combobox = combobox;

this.textarea = textarea;

this.textfield = textfield;

this.userLinkList = userLinkList;

isStop = false;}

public void run(){

while(!isStop &&!server.isClosed()){

try{

client = new Node();

client.socket = server.accept();

client.output = new ObjectOutputStream(client.socket.getOutputStream());

client.output.flush();

client.input = new ObjectInputStream(client.socket.getInputStream());

client.username =(String)client.input.readObject();

//显示提示信息

combobox.addItem(client.username);

userLinkList.addUser(client);

textarea.append(”用户 “ + client.username + ” 上线“ + ”n“);

textfield.setText(”在线用户“ + userLinkList.getCount()+ ”人n“);

recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);

recvThread.start();

}

catch(Exception e){

}

} } }

3、ServerReceive类

功能:实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的街面上。

代码:

package server;

import javax.swing.*;/* * 服务器收发消息的类 */ public class ServerReceive extends Thread { JTextArea textarea;JTextField textfield;JComboBox combobox;

Node client;UserLinkList userLinkList;//用户链表

public boolean isStop;

public ServerReceive(JTextArea textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea;this.textfield = textfield;this.client = client;this.userLinkList = userLinkList;this.combobox = combobox;

isStop = false;}

public void run(){ //向所有人发送用户的列表

sendUserList();

while(!isStop &&!client.socket.isClosed()){

try{

String type =(String)client.input.readObject();

if(type.equalsIgnoreCase(”聊天信息“)){

String toSomebody =(String)client.input.readObject();

String status =(String)client.input.readObject();

String action =(String)client.input.readObject();

String message =(String)client.input.readObject();

String msg = client.username

+” “+ action

+ ”对 “

+ toSomebody

+ ” 说 : “

+ message

+ ”n“;

if(status.equalsIgnoreCase(”悄悄话“)){

msg = ” [悄悄话] “ + msg;

}

textarea.append(msg);

if(toSomebody.equalsIgnoreCase(”所有人“)){ 33

sendToAll(msg);//向所有人发送消息

} else{

try{

client.output.writeObject(”聊天信息“);

client.output.flush();

client.output.writeObject(msg);

client.output.flush();

}

catch(Exception e){

//System.out.println(”###“+e);

}

Node node = userLinkList.findUser(toSomebody);

if(node!= null){

node.output.writeObject(”聊天信息“);

node.output.flush();

node.output.writeObject(msg);

node.output.flush();

} } } else if(type.equalsIgnoreCase(”用户下线“)){ Node node = userLinkList.findUser(client.username);userLinkList.delUser(node);

String msg = ”用户 “ + client.username + ” 下线n“;int count = userLinkList.getCount();

combobox.removeAllItems();combobox.addItem(”所有人“);int i = 0;while(i < count){ node = userLinkList.findUser(i);if(node == null){

i ++;

continue;} combobox.addItem(node.username);i++;} combobox.setSelectedIndex(0);34

textarea.append(msg);

textfield.setText(”在线用户“ + userLinkList.getCount()+ ”人n“);

sendToAll(msg);//向所有人发送消息

sendUserList();//重新发送用户列表,刷新

break;

}

}

catch(Exception e){

//System.out.println(e);

} } } /* * 向所有人发送消息 */ public void sendToAll(String msg){ int count = userLinkList.getCount();

int i = 0;while(i < count){

Node node = userLinkList.findUser(i);

if(node == null){

i ++;

continue;

}

try{

node.output.writeObject(”聊天信息“);

node.output.flush();

node.output.writeObject(msg);

node.output.flush();

}

catch(Exception e){

//System.out.println(e);

}

i++;} }

} /* * 向所有人发送用户的列表 */ public void sendUserList(){ String userlist = ”“;int count = userLinkList.getCount();

} int i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){

i ++;

continue;}

userlist += node.username;userlist += 'n';i++;}

i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){

i ++;

continue;}

try{

node.output.writeObject(”用户列表“);

node.output.flush();

node.output.writeObject(userlist);

node.output.flush();} catch(Exception e){

//System.out.println(e);} i++;}

4、UserLinkList类

功能:用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加

用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。

代码:

package server;/** * 用户链表 */ public class UserLinkList { Node root;Node pointer;int count;

/** * 构造用户链表

*/ public UserLinkList(){

root = new Node();

root.next = null;

pointer = null;

count = 0;}

/** * 添加用户

*/ public void addUser(Node n){

pointer = root;

while(pointer.next!= null){

pointer = pointer.next;

}

pointer.next = n;

n.next = null;

count++;

}

/** * 删除用户

*/ public void delUser(Node n){

pointer = root;

while(pointer.next!= null){

if(pointer.next == n){

pointer.next = n.next;

count--;

break;

}

pointer = pointer.next;} } /** * 返回用户数 */ public int getCount(){ return count;} /** * 根据用户名查找用户 */ public Node findUser(String username){ if(count == 0)return null;

pointer = root;

while(pointer.next!= null){

pointer = pointer.next;

if(pointer.username.equalsIgnoreCase(username)){

return pointer;

} }

return null;} /** * 根据索引查找用户 */ public Node findUser(int index){ if(count == 0){

return null;38

}

} }

if(index < 0){ return null;}

pointer = root;

int i = 0;while(i < index + 1){ if(pointer.next!= null){

pointer = pointer.next;} else{

return null;}

i++;}

return pointer;

5、Node类

功能:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。

代码:

package server;

import java.net.*;import java.io.*;/** * 用户链表的结点类 */ public class Node { String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;

Node next = null;39

}

6、PortConf类

功能:该类继承自Jdialog,是用户对服务器端监听端口进行修改配置的类。代码:

package server;

import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * 生成端口设置对话框的类 */ public class PortConf extends JDialog { /** * */ private static final long serialVersionUID = 1L;JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(” 默认端口号为:8888“);

JPanel panelSave = new JPanel();JLabel message = new JLabel();

public static JTextField portNumber;

public PortConf(JFrame frame){

super(frame, true);

try {

jbInit();

}

catch(Exception e){

e.printStackTrace();

}

//设置运行位置,使对话框居中

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

this.setLocation((int)(screenSize.width600)/ 2 + 150);

this.setResizable(false);40

}

private void jbInit()throws Exception {

this.setSize(new Dimension(300, 120));

this.setTitle(”端口设置“);

message.setText(”请输入侦听的端口号:“);

portNumber = new JTextField(10);

portNumber.setText(”“+ChatServer.port);

save.setText(”保存“);

cancel.setText(”取消“);

panelPort.setLayout(new FlowLayout());

panelPort.add(message);

panelPort.add(portNumber);

panelSave.add(new Label(” “));

panelSave.add(save);

panelSave.add(cancel);

panelSave.add(new Label(” “));

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

contentPane.add(panelPort, BorderLayout.NORTH);

contentPane.add(DLGINFO, BorderLayout.CENTER);

contentPane.add(panelSave, BorderLayout.SOUTH);

//保存按钮的事件处理

save.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent a){

int savePort;

try{

savePort=Integer.parseInt(PortConf.portNumber.getText());

if(savePort<1 || savePort>65535){

PortConf.DLGINFO.setText(” 侦听端口必须是0-65535之间的整数!“);

PortConf.portNumber.setText(”“);

return;

}

ChatServer.port = savePort;

dispose();

} 41

catch(NumberFormatException e){

PortConf.DLGINFO.setText(” 错误的端口号,端口号请填写整数!“);

PortConf.portNumber.setText(”“);

return;

}

}

});

//关闭对话框时的操作

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

DLGINFO.setText(”

为:8888“);

}

});

//取消按钮的事件处理

cancel.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

DLGINFO.setText(”

为:8888“);

dispose();

}

});} }

7、Help类

功能:服务端程序帮助类。代码:

package server;

import java.awt.*;import javax.swing.*;import java.awt.event.*;/** 42

默认端口号默认端口号

* 生成设置对话框的类 */ public class Help extends JDialog {

/** * */ private static final long serialVersionUID = 1L;JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();

JButton close = new JButton();JLabel title = new JLabel(”聊天室服务端帮助“);JTextArea help = new JTextArea();

Color bg = new Color(255,255,255);

public Help(JFrame frame){

super(frame, true);

try {

jbInit();

}

catch(Exception e){

e.printStackTrace();

}

//设置运行位置,使对话框居中

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

this.setLocation((int)(screenSize.width320)/ 2);

this.setResizable(false);}

private void jbInit()throws Exception {

this.setSize(new Dimension(400, 200));

this.setTitle(”帮助“);

titlePanel.setBackground(bg);;

contentPanel.setBackground(bg);

closePanel.setBackground(bg);

help.setText(”

1、设置服务端的侦听端口(默认端口为8888)。n“+

2、点击 启动服务 按钮便可在指定的端口启动服务。n“+

3、选择需要接受消息的用户,在消息栏中写入消息,之后便可发送消息。n“+ 43

}

} ”

4、信息状态栏中显示服务器当前的启动与停止状态、“+ ”用户发送的消息和n 服务器端发送的系统消息。“);help.setEditable(false);titlePanel.add(new Label(” “));titlePanel.add(title);titlePanel.add(new Label(” “));contentPanel.add(help);closePanel.add(new Label(” “));closePanel.add(close);closePanel.add(new Label(” “));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(titlePanel, BorderLayout.NORTH);contentPane.add(contentPanel, BorderLayout.CENTER);contentPane.add(closePanel, BorderLayout.SOUTH);close.setText(”关闭“);//事件处理

close.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

dispose();

} });

8、ChatClient类

功能:定义客户端的界面,添加时间监听与事件处理。该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话。

代码:

package client;

import java.awt.*;import java.awt.event.*;import javax.swing.*;

import java.io.*;import java.net.*;/* * 聊天客户端的主框架类 */ public class ChatClient extends JFrame implements ActionListener{

/** * */ private static final long serialVersionUID = 1L;String ip = ”127.0.0.1“;//连接到服务端的ip地址

int port = 8888;//连接到服务端的端口号

String userName = ”匆匆过客“;//用户名

int type = 0;//0表示未连接,1表示已连接

JComboBox combobox;//选择发送消息的接受者

JTextArea messageShow;//客户端的信息显示

JScrollPane messageScrollPane;//信息显示的滚动条

JLabel express,sendToLabel,messageLabel;

JTextField clientMessage;//客户端消息的发送

JCheckBox checkbox;//悄悄话

JComboBox actionlist;//表情选择

JButton clientMessageButton;//发送消息

JTextField showStatus;//显示用户连接状态

Socket socket;ObjectOutputStream output;//网络套接字输出流

ObjectInputStream input;//网络套接字输入流

ClientReceive recvThread;

//建立菜单栏

JMenuBar jMenuBar = new JMenuBar();//建立菜单组

JMenu operateMenu = new JMenu(”操作(O)“);//建立菜单项

JMenuItem loginItem = new JMenuItem(”用户登录(I)“);JMenuItem logoffItem = new JMenuItem(”用户注销(L)“);JMenuItem exitItem=new JMenuItem(”退出(X)“);

JMenu conMenu=new JMenu(”设置(C)“);JMenuItem userItem=new JMenuItem(”用户设置(U)“);JMenuItem connectItem=new JMenuItem(”连接设置(C)“);

JMenu helpMenu=new JMenu(”帮助(H)“);JMenuItem helpItem=new JMenuItem(”帮助(H)“);//建立工具栏

JToolBar toolBar = new JToolBar();//建立工具栏中的按钮组件

JButton loginButton;//用户登录 JButton logoffButton;//用户注销 JButton userButton;//用户信息的设置 JButton connectButton;//连接设置 JButton exitButton;//退出按钮

//框架的大小

Dimension faceSize = new Dimension(400, 600);JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;

public ChatClient(){ init();//初始化程序

//添加框架的关闭事件处理

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//设置框架的大小

this.setSize(faceSize);//设置运行时窗口的位置

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(”聊天室客户端");//设置标题 setVisible(true);//为操作菜单栏设置热键'V' operateMenu.setMnemonic('O');46

下载JAVA聊天室实验报告word格式文档
下载JAVA聊天室实验报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    JAVA实验报告

    河北北方学院信息科学与工程学院 《Java程序设计》 实 验 报 告 实验学期 2014 至 2015 学年 第 2 学期 学生所在系部 信息科学与工程学院 年级 2012 专业班级 电子三班 学......

    JAVA实验报告

    学 生 实 验 报 告 册 (理工类) 课程名称:面向对象程序设计 专业班级:16计算机科学与技术(专转本) 学生学号: 1613203022 学生姓名: 张义丹 所属院部: 计算机工程 指导教师: 刘 晶 2......

    JAVA实验报告

    实验报告一、 实验目的 巩固复习课上所讲内容,进一步熟悉面向对象编程。 二、 实验内容 编写程序求点到原点的距离三、 程序清单及运行结果 abstractclass Distance { abstra......

    java实验报告

    学 生 实 验 报 告 册 2013——2014学年第1学期 项目名称: Java Web 学院: 信电 班级:11计算机科学与技术一班 学号: 155140007 姓名: 伍振东 指导教师: 李竹林 完成时间: 2013/9/2......

    Java聊天室课程设计报告[最终定稿]

    UML课程设计 题 目网络聊天程序开发设计与实现 学 号:201515614376 姓 名: 卫国辉 指导教师: 完成时间:2017年 12月 0 目录 1.摘要...............................................

    Java上机实验报告

    Homework3实验报告 一、实验目的与要求 1、掌握Java中类和接口的基本知识; 2、继承的基本知识; 3、集合的基本操作 二、实验内容 1.PIMCollection 类 创建一个可以管理PIMEnti......

    java实验报告4

    实验项目名称:实验4 基于Socket的网络编程 【实验目的】 1、 理解Java的基于套接字的网络通信原理。 2、 理解客户端和服务器的概念。 3、 学习使用套接字实现客户端和服务......

    java实验报告4

    实验报告_实验4 常用类(学生学号_姓名) 一、实验目的 1.掌握String类的基本构造方法和常用方法的使用; 2.熟悉StringBuffer类的追加、插入、查找、替换、删除等操作; 3.熟悉Math......