java聊天室

时间:2024.4.20

Java

网络编程论文

题    目: 简易聊天室

指导老师: 张      俊

班    级: 信管10-2班

姓    名: xxxxxxxxxxx

学    号: 311009xxxx

时    间: 20##-5-20


 

目录

摘要
1、课题描述

1.1、 设计目的....................................................................3

1.2、 设计思路....................................................................3
2、需求分析

2.1、设计前提 ....................................................................4

2.2、功能要求 ....................................................................4
3、详细设计

3.1、客户端设计...................................................................5
3.1.1、ChatClient.java

3.2、服务端设计...........................................................7
       3.2.1 、ChatServer.java  

4、运行结果.........................................................................9

5、自我总结........................................................................10

摘要:

网聊天室是一种现今应用广泛的网络聊天方式,操作简单,功能丰富,是认识学习面向对象编程思想的很好例子,本文中主要运用JAVA语言相关知识来设计和实现一个简单的聊天室过程,采用Cliect/Server构架框架,整个项目分为服务端和客户端。利用Socket网络开发技术,采用多线程的设计思想实现客户端和服务端的链接访问,实现基本的通信功能,

关键字:JAVA、Socket、Cliect/Server

1. 课题描述:

1.1、 设计目的:

设计题目为简单的聊天室,运用所学Java语言的基本知识,掌握Cliect/Server,运用JDK、Eclipse等开发工具,全面掌握 Java 语言的编程思想及面向对象程序设计的方法,把相关知识融会贯通起来实现基本聊天通信功能。

   1.2、 设计思路:
    Java 是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。Java 的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。而且,Java 很小,不需要占用多大内存。 因此运用 JAVA 程序编写聊天室,实现简单聊天功能。本次课程设计做的是 Java 简单聊天室,它是图形界面、线程、流与文件等技术的综合应用。 程序实现了聊天室的基本功能,其基本流程图如下:














 

2. 需求分析:

2.1、设计前提:
    在当今的信息时代,越来越多的聊天工具被应用 ,Java 语言是当今 流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程 等特 点。为了进一步巩固课堂上所学到的知识,深刻把握 Java 语言的重要概念 及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决 实际问题的能力,开设了 Java 程序设计课程设计。
   2.2、功能要求:
        (1)客户端能够登陆

(2)实现一对一、多对多聊天

(3)可以显示其他用户的当前状态
3. 详细设计:

3.1、客户端设计:

3.1.1、ChatClient.java:

package Chat

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class ChatClient {

    JTextArea jta;

    JTextField jtf;

    BufferedReader in;

    PrintWriter out;

    private void initGUI(){

        JFrame f=new JFrame("Client");

        f.setSize(400,300);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jta=new JTextArea();

        jta.setEditable(false);

        f.add(new JScrollPane(jta));

        jtf=new JTextField();

        f.add(jtf,"South");

        f.setVisible(true);

        jtf.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {

                String text=jtf.getText();

                jtf.setText("");

                out.println(text);

                out.flush();

            }

        });

    }

    private void initNet(){

        try {

            Socket s = new Socket("127.0.0.1",8186);

            out = new PrintWriter(s.getOutputStream());

getOutputStream()

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

        } catch (UnknownHostException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    private void receive(){

        try {

            while(true){

                String str = in.readLine();              

 if(str==null){

                    return ;

                }

                jta.append("说"+str+"\n");

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    private Client(){

        this.initGUI();

        this.initNet();

    }

    public static void main(String args[]){

        Client c = new Client();

        c.receive();

    }

}

3.2、服务端设计:
        3.2.1、ChatServer.java:

package Chat;

import java.net.*;

import java.io.*;

import java.util.*;

public class ChatServer {

public static void main(String args[]){

try {

ServerSocket ss = new ServerSocket(8186);

            List sockets = new ArrayList();

            while(true){

                Socket s = ss.accept();

                sockets.add(s);

                Thread t1 = new ChatThread(s,sockets);

                t1.start();

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }   

}

class ChatThread extends Thread{

    Socket s;

    List sockets;

    public ChatThread(Socket s,List sockets){

        this.s=s;

        this.sockets=sockets;

    }

    public void run(){

        try {

            BufferedReader in = new BufferedReader(

                    new InputStreamReader(s.getInputStream()));

            while(true){

                String str = in.readLine();//读BufferedReader

                for(int i=0;i<sockets.size();i++){

                    Socket s2 = (Socket)sockets.get(i);

                    PrintWriter out = new PrintWriter(s2.getOutputStream());

                    out.println(str);

                    out.flush();

                }

            }

        } catch (IOException e) {}

        finally{

            try {

                s.close();

            } catch (IOException e) {}

        }

    }

}

4. 运行结果

      服务端启动, 客户端之间聊天:

 

5. 自我总结

本次课程设计,使自己在JAVA编程语言的使用方面得到一个全面锻炼自己的机会,充分的学习和利用了JAVA Swing界面开发技术,基本达到了设计要求。通过本次课程设计,加深了对TCP/UDP协议具体连接过程的理解,应用Socket技术实现网络连接功能,对网络的实现和通信方面有了进一步的理解,并通过多线程方面的应用,使客户端和服务器端可以实现多任务动能,为以后更深层次的编程奠定了基础;同时进一步复习了Java的相关编程知识,使自己专业理论知识得到进一步的巩固。在设计过程中遇到很多问题,通过不断地查阅资料,通过大量地阅读文献和通过上网查阅各种资料,了解网络聊天室在当今社会的发展趋势。从中得到很多启发,从而使所做的网络聊天室最大限度的满足用户的需要,建立了一个交流平台。程序的开发过程要养成良好的习惯,并遵循一定的标准规范,将过程进行合理分析设计,在以后的学习中一定会更加努力!!


第二篇:java聊天室论文


摘 要 ............................................. I ABSTR ACT ............................................ II

前 言 ................................................ 1

1.绪论 ............................................... 2

2.开发环境简介 ....................................... 3

2.2关于JDK1.4 4

3项目概况 ............................................. 5

4 概要设计 ........................................... 9

4.2聊天室客户端设计 11

4.2.1图形界面以及事件处理 8

4.22实现消息的收发 8

4.23侦听端口的修改配置

4.24设计帮助文档 ............................................................. 9

5.2服务器端的设计 ....................................................................................................... 26

5.22实现客户端的收发消息 ......................................................................................... 28

5.33端口的配置 ............................................................................................................. 34

5.44用户名登录的修改 37

5.55帮助文档 39

......................................................

参考文献 ............................................. 42

结束语 ............................................... 36

致 谢 ............................................ 37

摘 要

摘 要

本系统是java基于c/s模式的聊天室程序。聊天室共分为服务器端和客户端两个部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才能实现正常的聊天功能。

基于Java的聊天室是利用Eclipse开发包工具进行开发出的一款网络聊天室。这款聊天室是套接字通信开发采用c/s模式的聊天室程序。聊天室共分为服务器端和客户端两个部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才能实现正常的聊天功能。

本文分为七个部分,第一章详细介绍了J2ME的发展历史以及MIDP程序的基本框架生命周期以及手机多媒体的发展,第二部分介绍了开发工具的选择以及开发环境的搭建,第三到第五部分是系统的设计过程包括需求分析,系统的概要设计和详细设计,第六部分是系统测试与发布。

关键词:JAVA聊天室

Abstract

The development of Handset Video Player is based on the J2ME and uses the Eclipse removable development package tool. This Handset Video Player has used the MIDP2.0 of the J2ME which provides video connection MMAPI (Mobile Media API) that can broadcast and transcribe audio to broadcast video whose format is mpg, wmv and so on.

This article divides into seven parts, the first chapter detailed introduces the development history of J2ME, the MIDP procedure basic bone life cycle and the development of handset multimedia, the second part introduces the choose of development tool and the building of

development environment, from the third part to the fifth part is the design process of system which is include the demand analysis, the system outline design and the detailed design, the sixth part is about test and the issue of the system .

Key word: Handset Video Player;J2ME;MIDPprocedure

1.绪论.

1.1 关于Java聊天室概述

1..1.选题的依据及课题的意义

随着网络信息时代的来临,INTERNET应用越来越广泛,人们越来越习惯于在网上获取和交流信息。据调查显示,80%以上的人上网都会打开聊天工具来聊天,而几乎每一个年轻人都会去聊天。使用网上聊天已经成为现代年轻人一种新的交往方式。

根据网上调查,在所有参加网上聊天的大学生中,进聊天室进行聊天的占69.65%,使用网络寻呼机进行聊天的占37.93%,还有2.75%的受访者声称自己使用其他方式进行聊天。进聊天室聊天是一种较为公共的聊天方式,而使用网络寻呼机则是一种具有排他性的聊天方式,一般能够用网络寻呼机进行联络的,都是比较熟悉的网友。使用网络寻呼机还意味着使用者希望自己的网友随时与自己联系,表现出一种开放性的网上交际观念。聊天室更适合于陌生人之间进行较为主观、感兴化的讨论。所以有大部分的人会进入聊天室聊天,它会给人一个完全自由的聊天世界。

作为一个信息技术专业的学生,经过几年大学知识的系统学习,应该对计算机科学与技术这个名词有了一定的认识。在这几年里,我对本专业学习也有了长足的进步,在毕业即临时,我就选择了自己感兴趣的基于API的聊天室这个课题作为我的毕业设计及论文写作,以检验几年来的学习情况。

1.2.开发语言的选择

聊天室的发展呈现万花筒般的发展,开发工具可以是asp,php,cgi,vc++,c#,java等等,做出的聊天室各有千秋,本人以java为开发语言,对聊天室进行开发。

相信熟悉Java 演进历史的人或多或少都听说过,Java 技术一开始并非就叫做 Java ,而是叫做OAK ,而且最早的时候就是为了嵌入式系统而设计的一项产品。后来因为网际网路的发达,而OAK 的诸多特性刚好又适合用在网路上(例如可移植性、编译后程序码很小),因为商标已被注册的关系,因此 OAK 被改名成Java ,从此因缘际会地成了网路上的闪亮巨星,并随著时间越来越成熟,也慢慢地产生了许多非原本预期中的相关运用。虽然 Java 已经被用到许多企业级软件上,可是其实骨子里面还是非常适合用在嵌入式系统之中。

从上图可以看到从Java 1.0 发表之后,Java 就被广泛地使用在桌上型应用程序以及Applet 的开发上,但是,从Java 1.1 开始,Java又回到了它一开始的老路--也就是嵌入式系统方面的应用,在当时Sun Microsystems 发表了Embedded Java 与Personal

Java(也有人简称为PJava)这两项规格。其中Embedded Java 是为了资源十分有限,而且没有显示设备的嵌入式装置而设计; Personal Java 则是为了在能够与网际网路连线、并拥有显示系统(例如彩色LCD)的消费性电子装置而设计。接着Java 的版本演进到Java 2 ,这时为了再明显区分各种Java 的应用,所以分割出了J2EE 、J2SE、以及 J2ME 三种版本。所有JAVA版本与其所依据的虚拟器所堆积起来的结构如图1.1所示。

java聊天室论文

图1.1 JAVA各版本结构

2.开发环境简介

2.1 开发工具的选择

操作系统:linux

开发工具:

JDK1.4

Eclipse、Eclipseme插件

2.2 关于JDK1.4

. JDK是Sun公司分发的免费Java开发工具,Java SDK最早叫Java Software Develop Kit,后来改名为JDK,即Java Develop Kit。JDK作为Java开发工具包,主要用于构建在Java平台上运行的应用程序、Applet 和组件等。

2.3 JAVA开发环境的建立

为了能够编写并运行我们所编写的JAVA程序,我们需要在自己的本地机器中安装JDK

开发包,JDK是内置各种JAVA开发工具,JAVA虚拟机,JAVA API的一个压缩包。

(1)从下载J2SDK,最新的版本是1.4.2_08,下载后的JDK是个执行文件,我们运行后可直接安装,缺省的安装目录是C:\j2sdk1.4.2_08。

(2)在电脑中配置环境变量,点右键打开我的电脑属性,在高级中有个环境变量,选择新建系统变量:CLASSPATH,变量值:

“C:\j2sdk1.4.2_07\lib\tools.jar;C:\j2sdk1.4.2_07\lib\dt.jar;”,再新建变量名:PATH,变量值:“C:\j2sdk1.4.2_07;C:\j2sdk1.4.2_07\bin;”。具体设置如图2-3所示:

java聊天室论文

图2.1 系统环境变量配置

(4)选择一个编译工具。Eclipse是一款非常优秀的开源IDE,非常适合Java开发,由于支持插件技术,受到了越来越多的开发者的欢迎。最新的Eclipse3.1不但界面做了很大的增强,而且增加了代码折叠等众多优秀功能,速度也有明显的提升。配合众多另人眼花缭乱的插件,完全可以满足从企业级Java应用到手机终端Java游戏的开发。本人选择了Eclipse作为这次毕业设计的工具,选择Eclipse作为开发的理由再简单不过了,占用资源少,JBuilder2005和SunONE Studio 8.0 ME建议标准内存1G以上,最低512M,目前国内个人电脑一般都达不到这个配置。同时Eclipse目前基本为国内开发Java程序的标准的IDE,使用Eclipse将使手机程序开发更加简洁。

(5)安装Eclipse插件,并进行相应的配置[5]。

3 .项目概况

3.1、功能简介

本系统是java基于c/s模式的聊天室程序。聊天室共分为服务器端和客户端两个部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才能实现正常的聊天功能。

(1)服务器端的主要功能有:

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

b.用户可以配置服务器的侦听端口,默认是8889。

c.可以向已经连接的客户端发送体统消息。

d.统计在线人数。

e.停止服务时,断开所有的用户连接。

(2)客户端的主要功能有:

a.连接到已经开启聊天服务的服务端。

b.用户可以配置要连接的服务器IP地址和端口号。

c.用户可以配置连接后的用户名。

d.服务器开启时,用户可以随时登录与注消。

c.用户可以想所有的人或者指定的个人发送消息。

3.2、套接字通信

套接字通信(socket)是网络的基本通信单元,又称为端口,通常用来实现客户方和服务方的连接。网络上的两个程序通过双向的连接实现数据的交换,实现双方通信前链路的每一端都建立一个socket,通过对socket的读写操作实现网络的通信功能。

socket通信的过程主要有:创建socket,打开连接到socket的输入流和输出流,按照一定的协议对socket进行读写操作,关闭socket这四个步骤,通过这个四个步骤可以完成一般的socket通信。为了完成socket通信,java.net包中提供了

socket和serverSocket这两个类,它们分别用来表示双向连接的客户端和服务器断,它们的构造函数有:

Socket()

通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddress address, int port)

创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

创建一个套接字并将其连接到指定远程端口上的指定远程地址。

Socket(Proxy proxy)

根据不管其他设置如何都应使用的指定代理类型(如果有),创建一个未连接的套接字。

protected Socket(SocketImpl impl)

创建带有用户指定的 SocketImpl 的未连接 Socket。

Socket(String host, int port)

创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。

其中端口号涉及到一个分配的问题,TCP/IP将端口号分成了两个部分,少量的作

为保留端口,端口号小于256,以全局方式分配给服务进程。因此每一个标准服务器都拥有一个全局公认的端口,即使在不同的机器上其端口号也是不同的。对于常见的端口 号主要有:80端口提供www服务,23提供ftp服务,110提供pop服务。剩余的为自由端口,

4.概要设计

本系统是java基于c/s模式的聊天室程序。聊天室共分为服务器端和客户端两个部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才能实现正常的聊天功能。

服务器端的程序 客户端的程序

4.1

java聊天室论文

(1)图 调用java.swing和java.awt包进行图形界面处理和java.swing.event与java.awt.event事件的侦听处理。

(2)实现服务器消息的收发。

分别定义向所有用户或某一个用户发送消息的方法。

(3)定义用户的管理

定义添加用户,删除用户,返回用户数目,根据用户名查找用户,根据索引查找用户。

(4)设计帮助文档

单击帮助按钮,弹出一对话框显示本系统的有关信息.

...........4.2聊天室客户端设计

(1)图形界面以及事件处理

调用java.swing和java.awt包进行图形界面处理和java.swing.event与java.awt.event事件的侦听处理。

(2)实现消息的收发

分别定义向所有用户或某一个用户发送消息的方法。

(3)侦听端口的修改配置

用户对所要连接的服务器IP及侦听端口进行修改配置

(4)设计帮助文档

单击帮助按钮,弹出一对话框显示本系统的有关信息.为用户提供信息帮助。

5详细设计 5.1服务器端的设计

5.11.服务器端的界面设计

界面设计在应用程序很重要。造就一款成功的聊天室软件,抛开其他各种因素不谈,主菜单的设计非常重要,其关键是可用性。

界面的可用性是指高效、易用、易学、易记。如果用户界面不友好,即使用户对其感兴趣,由于菜单的原因使缺乏人性化设置,用户也不会再使用这个软件。一个友好的界面是非常关键的,界面设计必须在软件设计时就进行事件添加和事件侦听和事件处理。调用serverlisten()来实现服务端用户上线和下线的侦听,调用serverReceive()来实现服务器的消息收发。

服务器端的界面如下:

java聊天室论文

图1 服务器端界面效果

服务器界面代码实现如下:

public class ChatClient extends JFrame implements ActionListener{

String ip = "192.168.5.72";//连接到服务端的ip地址 int port = 8888;//连接到服务端的端口号 String userName = "梅山古道";//用户名 int type = 0;//0表示未连接,1表示已连接 Image icon;//程序图标 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.width - faceSize.getWidth()) / 2, (int) (screenSize.height - faceSize.getHeight()) / 2);

this.setResizable(true);

this.setTitle("聊天室客户端"); //设置标题

//程序图标

// icon =

getImage("/home/asd0709/lijie/jsp/liaotianshi/src/ChatServer/lily.gif");

// this.setIconImage(icon); //设置程序图标

show();

//为操作菜单栏设置热键'V'

operateMenu.setMnemonic('O');

//为用户登录设置快捷键为ctrl+i

loginItem.setMnemonic ('I');

loginItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_I,InputEvent.CTRL_MASK));

//为用户注销快捷键为ctrl+l

logoffItem.setMnemonic ('L');

logoffItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_L,InputEvent.CTRL_MASK));

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

exitItem.setMnemonic ('X');

exitItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_X,InputEvent.CTRL_MASK));

//为设置菜单栏设置热键'C'

conMenu.setMnemonic('C');

//为用户设置设置快捷键为ctrl+u

userItem.setMnemonic ('U');

userItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_U,InputEvent.CTRL_MASK));

//为连接设置设置快捷键为ctrl+c

connectItem.setMnemonic ('C');

connectItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_C,InputEvent.CTRL_MASK));

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

helpMenu.setMnemonic('H');

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

helpItem.setMnemonic ('H');

helpItem.setAccelerator (KeyStroke.getKeyStroke

(KeyEvent.VK_H,InputEvent.CTRL_MASK));

}

/**

* 程序初始化函数

*/

public void init(){

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

//添加菜单栏 operateMenu.add (loginItem); operateMenu.add (logoffItem); operateMenu.add (exitItem); jMenuBar.add (operateMenu); conMenu.add (userItem); conMenu.add (connectItem); jMenuBar.add (conMenu); helpMenu.add (helpItem); jMenuBar.add (helpMenu); setJMenuBar (jMenuBar); //初始化按钮 loginButton = new JButton("登录"); logoffButton = new JButton("注销"); userButton = new JButton("用户设置" ); connectButton = new JButton("连接设置" ); exitButton = new JButton("退出" ); //当鼠标放上显示信息 loginButton.setToolTipText("连接到指定的服务器"); logoffButton.setToolTipText("与服务器断开连接"); userButton.setToolTipText("设置用户信息"); connectButton.setToolTipText("设置所要连接到的服务器信息"); //将按钮添加到工具栏 toolBar.add(userButton); toolBar.add(connectButton); toolBar.addSeparator();//添加分隔栏 toolBar.add(loginButton); toolBar.add(logoffButton); toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); checkbox = new JCheckBox("悄悄话"); checkbox.setSelected(false); actionlist = new JComboBox(); actionlist.addItem("微笑地"); actionlist.addItem("高兴地"); actionlist.addItem("轻轻地"); actionlist.addItem("生气地"); actionlist.addItem("小心地"); actionlist.addItem("静静地"); actionlist.setSelectedIndex(0); //初始时 loginButton.setEnabled(true); logoffButton.setEnabled(false); //为菜单栏添加事件监听 loginItem.addActionListener(this); logoffItem.addActionListener(this); exitItem.addActionListener(this); userItem.addActionListener(this); connectItem.addActionListener(this); helpItem.addActionListener(this); //添加按钮的事件侦听 loginButton.addActionListener(this); logoffButton.addActionListener(this);

//

userButton.addActionListener(this); connectButton.addActionListener(this); exitButton.addActionListener(this); combobox = new JComboBox(); combobox.insertItemAt("所有人",0); combobox.setSelectedIndex(0); messageShow = new JTextArea(); messageShow.setEditable(false); messageShow.setLineWrap(true); messageShow.getWrapStyleWord(); //添加滚动条 messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(new Dimension(400,400)); messageScrollPane.revalidate(); clientMessage = new JTextField(23); clientMessage.setEnabled(false); clientMessageButton = new JButton(); clientMessageButton.setText("发送"); //添加系统消息的事件侦听 clientMessage.addActionListener(this); clientMessageButton.addActionListener(this); sendToLabel = new JLabel("发送至:"); express = 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 = 5; 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; //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 =2; girdBagCon.gridy = 2; girdBagCon.anchor = GridBagConstraints.LINE_END; girdBag.setConstraints(express,girdBagCon); downPanel.add(express); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 3; girdBagCon.gridy = 2; girdBagCon.anchor = GridBagConstraints.LINE_START; girdBag.setConstraints(actionlist,girdBagCon); downPanel.add(actionlist); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 4; girdBagCon.gridy = 2; girdBagCon.insets = new Insets(1,0,0,0); girdBag.setConstraints(checkbox,girdBagCon); downPanel.add(checkbox); 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; girdBagCon.gridwidth = 3; girdBagCon.gridheight = 1; girdBag.setConstraints(clientMessage,girdBagCon); downPanel.add(clientMessage); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 4; girdBagCon.gridy = 3; girdBag.setConstraints(clientMessageButton,girdBagCon); downPanel.add(clientMessageButton); showStatus = new JTextField(35); showStatus.setEditable(false); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 5; girdBagCon.gridwidth = 5; 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){ if(type == 1){ DisConnect(); } System.exit(0); } } ); } /** * 事件处理 */ public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == userItem || obj == userButton) { //用户信息设置 //调出用户信息设置对话框 UserConf userConf = new UserConf(this,userName); userConf.show(); userName = userConf.userInputName; } else if (obj == connectItem || obj == connectButton) { //连接服务端设置 //调出连接设置对话框 ConnectConf conConf = new ConnectConf(this,ip,port); conConf.show(); ip = conConf.userInputIp; port = conConf.userInputPort; } else if (obj == loginItem || obj == loginButton) { //登录 Connect(); } else if (obj == logoffItem || obj == logoffButton) { //注销 DisConnect(); showStatus.setText(""); } else if (obj == clientMessage || obj == clientMessageButton) { //发送消息 SendMessage(); clientMessage.setText(""); } else if (obj == exitButton || obj == exitItem) { //退出 int j=JOptionPane.showConfirmDialog( this,"真的要退出吗?","退出", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if (j == JOptionPane.YES_OPTION){ if(type == 1){ DisConnect(); } System.exit(0); } } else if (obj == helpItem) { //菜单栏中的帮助

//调出帮助对话框

Help helpDialog = new Help(this);

helpDialog.show();

} }

public void Connect(){

try{

socket = new Socket(ip,port);

}

catch (Exception e){

JOptionPane.showConfirmDialog(

this,"不能连接到指定的服务器。\n请确认连接设置是否正确。","提示",

JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);

return;

}

try{

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

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

output.writeObject(userName);

output.flush();

recvThread = new

ClientReceive(socket,output,input,combobox,messageShow,showStatus);

recvThread.start();

loginButton.setEnabled(false);

loginItem.setEnabled(false);

userButton.setEnabled(false);

userItem.setEnabled(false);

connectButton.setEnabled(false);

connectItem.setEnabled(false);

logoffButton.setEnabled(true);

logoffItem.setEnabled(true);

clientMessage.setEnabled(true);

messageShow.append("连接服务器 "+ip+":"+port+" 成功...\n"); type = 1;//标志位设为已连接

}

catch (Exception e){

System.out.println(e);

return;

}

}

public void DisConnect(){

loginButton.setEnabled(true);

loginItem.setEnabled(true);

userButton.setEnabled(true);

userItem.setEnabled(true);

connectButton.setEnabled(true);

connectItem.setEnabled(true);

logoffButton.setEnabled(false);

logoffItem.setEnabled(false); clientMessage.setEnabled(false); if(socket.isClosed()){ return ; } try{ output.writeObject("用户下线"); output.flush(); input.close(); output.close(); socket.close(); messageShow.append("已经与服务器断开连接...\n"); type = 0;//标志位设为未连接 } catch (Exception e){ // } } //发送信息 public void SendMessage(){ String toSomebody = combobox.getSelectedItem().toString(); String status = ""; if(checkbox.isSelected()){ status = "悄悄话"; } String action = actionlist.getSelectedItem().toString(); String message = clientMessage.getText(); if(socket.isClosed()){ return ; } try{ output.writeObject("聊天信息"); output.flush(); output.writeObject(toSomebody); output.flush(); output.writeObject(status); output.flush(); output.writeObject(action); output.flush(); output.writeObject(message); output.flush(); } catch (Exception e){ e.printStackTrace(); } } public static void main(String[] args) { ChatClient app = new ChatClient(); }

}

5.22实现服务器消息的收发。

package ChatServer;

import javax.swing.*;

import java.io.*;

import java.net.*;

/*

* @author lijie

*

* 服务器收发消息的类

*/

public class ServerReceive extends Thread {

this.textarea = textarea; this.textfield = textfield; this.client = client; this.userLinkList = userLinkList; this.combobox = combobox; isStop = false; 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){ 其实现代码如下: 分别定义向所有用户或某一个用户发送消息的方法。

} public void run(){ //向所有人发送用户的列表 sendUserList(); while(!isStop && !client.socket.isClosed()){ try{

(String)client.input.readObject();

(String)client.input.readObject();

(String)client.input.readObject();

(String)client.input.readObject();

(String)client.input.readObject();

话")){

msg;

String type = if(type.equalsIgnoreCase("聊天信息")){ String toSomebody = String status = String action = String message = String msg = client.username +" "+ action + "对 " + toSomebody + " 说 : " + message + "\n"; if(status.equalsIgnoreCase("悄悄 msg = " [悄悄话] " + } textarea.append(msg); if(toSomebody.equalsIgnoreCase("

所有人")){

}

else if(type.equalsIgnoreCase("用户下线

} else{ }

} }

Node node =

if(node != null){ }

catch (Exception e){ try{

sendToAll(msg);

//向所有人发送消息

client.output.writeObject("聊天信息"); client.output.flush();

client.output.writeObject(msg); client.output.flush();

System.out.println("###"+e);

userLinkList.findUser(toSomebody);

node.output.writeObject("聊天信息"); node.output.flush();

node.output.writeObject(msg); node.output.flush();

")){ 刷新

break;

textarea.append(msg);

textfield.setText("在线用户" +

sendToAll(msg);//向所有人发送消息 sendUserList();//重新发送用户列表,

}

combobox.setSelectedIndex(0);

i++;

combobox.removeAllItems(); combobox.addItem("所有人"); int i = 0; while(i < count){

node =

if(node == null) { }

i ++; continue;

Node node =

userLinkList.delUser(node);

String msg = "用户 " + int count =

userLinkList.findUser(client.username);

client.username + " 下线\n"; userLinkList.getCount();

userLinkList.findUser(i);

combobox.addItem(node.username);

userLinkList.getCount() + "人5.22实现服务器消息的收发。\n");

} /* } } } 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) { } try{ } catch (Exception e){ } i++; //System.out.println(e); node.output.writeObject("聊天信息"); node.output.flush(); node.output.writeObject(msg); node.output.flush(); i ++; continue;

/* * 向所有人发送用户的列表 */ public void sendUserList(){ String userlist = ""; int count = userLinkList.getCount(); int i = 0; while(i < count){ } i = 0; while(i < count){ Node node = userLinkList.findUser(i); if(node == null) { } try{ } catch (Exception e){ e.printStackTrace(); node.output.writeObject("用户列表"); node.output.flush(); node.output.writeObject(userlist); node.output.flush(); i ++; continue; Node node = userLinkList.findUser(i); if(node == null) { } userlist += node.username; userlist += '\n'; i++; i ++; continue;

}

} } } i++;

5.33用户侦听设计

主函数调用该方法用于侦听用户的上线与下线,但必须调用userLinklist()来实现那的,用户在线情况发生变换时,该类会对主类的界面进行修改。

实现代码如下:

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){

}

}

}

}

5.44定义用户的管理

定义添加用户,删除用户,返回用户数目,根据用户名查找用户,根据索引查找用户。

代码实现如下:

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; } 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.55设计帮助文档

单击帮助按钮,弹出一对话框显示本系统的有关信息.为用户提供信息帮助。

代码实现如下:

public class Help extends JDialog {

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.width - 400) / 2, (int)

(screenSize.height - 320) / 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"+

"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();

}

}

);

}

}

5.2服务器端的设计

5.21.客户端的界面设计

该界面的设计于服务器端的效果很相同,代码的实现也非常的雷同在这里代码的就没有进行累赘的描述。

界面效果图如下:

java聊天室论文

客户端界面效果图

5.22实现客户端的收发消息

聊天客户端消息收发类

*/

public class ClientReceive extends Thread { private JComboBox combobox; private JTextArea textarea;

Socket socket;

ObjectOutputStream output; ObjectInputStream input;

JTextField showStatus;

public ClientReceive(Socket socket,ObjectOutputStream output, ObjectInputStream input,JComboBox combobox,JTextArea textarea,JTextField showStatus){

this.socket = socket;

this.output = output;

this.input = input;

this.combobox = combobox;

this.textarea = textarea;

this.showStatus = showStatus;

}

public void run(){

while(!socket.isClosed()){

try{

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

if(type.equalsIgnoreCase("系统信息")){ String sysmsg =

(String)input.readObject();

textarea.append("系统信息: "+sysmsg);

}

else if(type.equalsIgnoreCase("服务关闭")){

output.close();

input.close();

socket.close();

textarea.append("服务器已关闭!\n");

/* textarea.setFont(bold);*/ break;

}

else if(type.equalsIgnoreCase("聊天信息")){

String message =

(String)input.readObject();

textarea.append(message); }

else if(type.equalsIgnoreCase("用户列表")){

String userlist =

(String)input.readObject();

String usernames[] =

userlist.split("\n");

combobox.removeAllItems();

int i =0;

combobox.addItem("所有人"); while(i < usernames.length){

combobox.addItem(usernames[i]);

i ++;

}

combobox.setSelectedIndex(0); showStatus.setText("在线用户 " + usernames.length + " 人");

}

}

catch (Exception e ){

System.out.println(e);

}

}

}

}

5.33端口的配置

实现代码如下

ublic class ConnectConf extends JDialog {

JPanel panelUserConf = new JPanel();

JButton save = new JButton();

JButton cancel = new JButton();

JLabel DLGINFO=new JLabel(

" 默认连接设置为192.168.5.72 :8888");

JPanel panelSave = new JPanel();

JLabel message = new JLabel();

String userInputIp;

int userInputPort;

用户对所有连接的服务器IP及侦听端口进行修改配置的类

JTextField inputIp;

JTextField inputPort;

public ConnectConf(JFrame frame,String ip,int port) {

super(frame, true);

this.userInputIp = ip;

this.userInputPort = port;

try {

jbInit();

}

catch (Exception e) {

e.printStackTrace();

}

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

Dimension screenSize =

Toolkit.getDefaultToolkit().getScreenSize();

this.setLocation( (int) (screenSize.width - 400) / 2 + 50, (int)

(screenSize.height - 600) / 2 + 150);

this.setResizable(false);

}

private void jbInit() throws Exception {

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

this.setTitle("连接设置");

message.setText(" 请输入服务器的IP地址:");

inputIp = new JTextField(10);

inputIp.setText(userInputIp);

inputPort = new JTextField(4);

inputPort.setText(""+userInputPort);

save.setText("保存");

cancel.setText("取消");

panelUserConf.setLayout(new GridLayout(2,2,1,1)); panelUserConf.add(message);

panelUserConf.add(inputIp);

panelUserConf.add(new JLabel(" 请输入服务器的端口号:")); panelUserConf.add(inputPort);

panelSave.add(new Label(" "));

panelSave.add(save);

panelSave.add(cancel);

panelSave.add(new Label(" "));

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

contentPane.add(panelUserConf, BorderLayout.NORTH);

contentPane.add(DLGINFO, BorderLayout.CENTER);

contentPane.add(panelSave, BorderLayout.SOUTH);

//保存按钮的事件处理

save.addActionListener(

new ActionListener() {

public void actionPerformed (ActionEvent a) {

int savePort;

String inputIP;

//判断端口号是否合法

try{

userInputIp = "" +

InetAddress.getByName(inputIp.getText());

userInputIp =

userInputIp.substring(1);

}

catch(UnknownHostException e){

DLGINFO.setText(

" 错误的IP地址!");

return;

}

//userInputIp = inputIP;

//判断端口号是否合法

try{

savePort =

Integer.parseInt(inputPort.getText());

if(savePort<1 ||

savePort>65535){

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

inputPort.setText("");

return;

}

userInputPort =

savePort;

dispose();

}

catch(NumberFormatException e){

DLGINFO.setText("

错误的端口号,端口号请填写整数!");

inputPort.setText(""); return;

}

}

}

);

//关闭对话框时的操作

this.addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){ DLGINFO.setText(" 默认连接设置为 192.168.5.72 :8888");

}

}

);

//取消按钮的事件处理

cancel.addActionListener(

new ActionListener(){

public void actionPerformed(ActionEvent e){

DLGINFO.setText(" 默认连接设置为 192.168.5.72 :8888");

dispose();

}

}

);

}

}

5.44用户名登录的修改

用户对连接到服务器时所显示的用户名进行修改配置的类

代码实现如下:

public class UserConf extends JDialog {

JPanel panelUserConf = new JPanel();

JButton save = new JButton();

JButton cancel = new JButton();

JLabel DLGINFO=new JLabel(

" 默认用户名为:梅山古道");

JPanel panelSave = new JPanel();

JLabel message = new JLabel();

String userInputName;

JTextField userName ;

public UserConf(JFrame frame,String str) {

super(frame, true);

this.userInputName = str;

try {

jbInit();

}

catch (Exception e) {

e.printStackTrace();

}

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

Dimension screenSize =

Toolkit.getDefaultToolkit().getScreenSize();

this.setLocation( (int) (screenSize.width - 400) / 2 + 50, (int)

(screenSize.height - 600) / 2 + 150);

this.setResizable(false);

}

private void jbInit() throws Exception {

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

this.setTitle("用户设置");

message.setText("请输入用户名:");

userName = new JTextField(10);

userName.setText(userInputName);

save.setText("保存");

cancel.setText("取消");

panelUserConf.setLayout(new FlowLayout());

panelUserConf.add(message);

panelUserConf.add(userName);

panelSave.add(new Label(" "));

panelSave.add(save);

panelSave.add(cancel);

panelSave.add(new Label(" "));

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

contentPane.add(panelUserConf, BorderLayout.NORTH); contentPane.add(DLGINFO, BorderLayout.CENTER);

contentPane.add(panelSave, BorderLayout.SOUTH);

//保存按钮的事件处理

save.addActionListener(

new ActionListener() {

public void actionPerformed (ActionEvent a) {

if(userName.getText().equals("")){

DLGINFO.setText(

" 用户名不能为空!");

userName.setText(userInputName);

return;

}

else

if(userName.getText().length() > 15){

DLGINFO.setText(" 用户名长度不能大于15个字符!");

userName.setText(userInputName);

return;

}

userInputName =

userName.getText();

dispose();

}

}

);

//关闭对话框时的操作

this.addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){

DLGINFO.setText(" 默认用户名为:梅山古道");

}

}

);

//取消按钮的事件处理

cancel.addActionListener(

new ActionListener(){

public void actionPerformed(ActionEvent

e){

默认用户名为:梅山古道");

);

}

}

5.55帮助文档 } } DLGINFO.setText(" dispose();

帮助文档的实现与服务器端的帮助文档相同,在这里没有赘变。

6.本项目小结

本聊天室介绍了整个开发的详细设计过程,包括了算法的实现,并对比较重要的函数作了详细分析。虽然目前网络上流行的聊天室五花八门,功能也非常的多,本系统主要以文字的形式进行网路传输,与之上线的聊天室相比,本系统的功能是比较简单的,但是通过本系统的开发,基本上体现了,聊天室的流程,用到了网络传输的基本知识及软件开发的过程。这个功能也是以后可以多样化功能的基础。随着社会的进步,聊天室将具有非常大的发展空间。

参考文献

[1] 邹建峰JAVA2核心技术.机械工业出版社[M], 2005, 1-1.

[2] Bruce Eckel[美.JAVA2编程思想[M]. 侯捷 译.机械工业出版社,2005,1-1.

[3] 黄聪明.精通JAVA2程序设计[J].清华大学出版社,2004,3-4.

[4] Addison Wesley[美].The Java Programming Language[M].电子文档,2006, 1-1.

[5] Stephen Walther[美]. Java Sourcebook Computer Publishing[M] .中国电力出版社,2204,23-25.

[6] 网站. .

[7] 网站. http://www.chinaItlab.com.

结束语

本次设计已经是大学中最后一次对专业知识的综合实践活动,同时也是我所做工作量最大的一次作业,因此从一开始我对本次毕业设计就给予了高度的重视。从选题,收集,资料,学习相关技术到实现编程,我都一丝不苟的对待。

经过几个月的努力,我完成了这个基于java的聊天室。在设计过程中,我遇到了很多的难题,在解决这些问题的同时,我也加深了对JAVA语言的了解,特别是套节字通信部分,也学会了解决问题的方法。我制作的这个聊天室基本完成了设计要求的功能,不但实现了单人发送信息和多个人发送信息等功能,用户侦听统计管理等。但是由于自身知识的不足,有很多想法没有能够最后实现:

(1)没有发送图片等功能。

(2)保存聊天的历史记录。

(3)界面的耦合性太强。

虽然有这样那样的不足,但是通过这次设计,我的综合能力和知识都得到了很大提高。我对java语言的开发也产生了极大的兴趣。希望在以后我能够更进一步,

更多相关推荐:
java局域聊天室实践总结

河北科技师范学院JAVA程序设计课程设计个人实习总结实习类型课程设计实习单位指导教师所在院系信息技术系班级姓名学号一实习时间和地点时间20xx31720xx414地点F310F311二实习的内容我所开发的系统是...

java聊天室设计总结

JAVA聊天室程序设计总结大二第一学期末我们进行了为期两周的java实习这次的实习内容是设计一个多人聊天室在网络越来越发达的今天人们对网络的依赖越来越多越来越离不开网络由此而产生的聊天工具越来越多类似QQMSN...

java聊天室项目设计书

Java项目设计聊天室设计设计人XXX指导老师XXX设计时间20xx417到20xx424目录第一部分项目概况1项目说明42项目背景4第二部分项目计划1项目目标42项目范围43项目策略44项目开发周期45每项任...

java项目总结

DBHelp类packagecomxunpoitprodbimportjavasqlConnectionimportjavasqlDriverManagerimportjavasqlSQLExceptionim...

《Java程序设计基础》项目设计报告

Java程序设计基础项目设计报告题目求三角形面积的实现专业班级学号姓名完成时间成绩课程设计说明书论文第I页目录1设计的目的111设计的目的112内容要求12系统基本框架结构图23系统功能设计331系统主界面设计...

Java Me 小项目报告

手机应用程序开发JavaME项目报告学院信息科学与技术班级学号姓名主要功能屏幕上有一个小球上下弹动按左键向左移动按右键向右移送按上键减速按下键加速中间的确定键变大其他键改变颜色在红绿蓝色之间变化右软件可以暂停或...

java计算器项目课程设计报告(包涵源文件与类图)

计算机网络技术专业专业代码590102动态网站基础程序设计课程设计班级网站1101班学号20xx352220xx184220xx221520xx515320xx352820xx289320xx352320xx3...

Java雷电游戏项目报告模板

北京青年政治学院小学期达内JAVA课程项目报告项目题目专业班级学生姓名学生学号雷电游戏的设计与实现指导教师姓名目录一系统目标X二系统设计思路X三系统详细设计X四系统实现X五系统设计总结XX六参考文献XX1一系统...

Java EE项目开发实验报告

实验一Struts框架技术及应用一实验目的掌握Struts框架技术的原理及其在项目中的应用掌握MVC开发模式二实验内容创建一个用于本次和后续JavaEE项目的名为test的数据库并在数据库中创建一个名为user...

java个人记事本总结报告

计算机学院工程实践总结报告个人记事本小组序号组员姓名年级班级指导教师姓名提交日期目录12引言2项目需求分析及方案2212223243程序的基本功能2输入输出要求3测试数据3设计方案3项目概要设计4313233抽...

Java项目报告模版

Java程序设计项目报告班级姓名学号指导教师20xx年06月3日1选题概述题目javaXX应用程序简介通过本程序可以实现XX的基本功能程序是Frame类的子类使用GridLayout的布局方式对组件进行布局用P...

Java小项目报告

HUNANUNIVERSITYJava小项目报告题目:学生成绩管理系统学生姓名吕良学生学号***专业班级计算机科学与技术(3)班指导老师文佳宝完成日期20**.12.23Java小项目:学生成绩管理系统一、项目…

java聊天室项目总结(4篇)