JAVA网络聊天室的设计与实现

JAVA网络聊天室的设计与实现



(2年前写的了!)

1. 问题描述

JAVA聊天室是用java程序实现的,由客户端和服务器端组成。先启动服务器端,再启动客户端,服务器验证身份后客户便可登陆聊天室。 

对于客户来说:注册、登陆和退出聊天室时都有相关提示信息;用户应该可以看到所有在线的用户;聊天时可以群聊,也可以选择某个聊天对象私聊。
 
对于服务器来说:登录聊天室时必须输入正确的用户名和密码,未注册用户必须先注册;可以显示当前使用的端口,IP地址及在线人数;可以显示所有用户注册、登陆及退出等信息,且在用户登陆和退出时可以实时刷新在线用户列表;可以显示所有聊天记录,并可以将记录保存在文件中。

2. 软件设计

完成这个作业参考了马士兵的Java系列视频及从网络上下载的代码,对其进行了修改和完善,主要是增加了服务器窗口,实时显示相关信息、在线用户列表等。

对于网络聊天器来说,核心思想是基于套接字的编程。在这里,打个小小的比方,我们的程序在Win32环境下表示为一个进程,也可以比喻成一所房子,该进程的套接字就好比是一扇门。我们的服务器,也就是房子的主人,如果他没睡觉的情况下,也就是位于运行状态时,是一直在倾听且欢迎着门外的敲门声的。

客户端程序运行时,会向服务器发起一个连接,即敲服务器家里的门,在程序上是通过创建一个套接字来完成的。当服务器听到了敲门声之后,他会创建一个新的门,专门为这个客户服务,在Java代码上是通过serverSocket.accept()来实现的。这个门也就只为这个客户而开,当客户离开之后,服务器也会将这扇门关闭。

客户端: 
  • ChatClient.java,完成客户端窗口的绘制及发起连接、关闭、聊天;
  
服务器端: 
  • ChatServer.java,服务器端,启动服务器端口并进行监听;
  • ServerFrame.java,服务器窗口,主要是服务器窗口绘制;
  • ServerProcess.java,服务器和客户端连接的处理,包括登陆、注册、退出、信息的发送。

2.1 客户端

进入聊天室主界面之前有一个登陆对话框。其中包括服务器ip地址,用户名和密码的填写。聊天室的主界面主要分为两个大容器,中间是textViewTalk(TextArea),显示详细的聊天信息,界面下面是一个输入的界面,包括发言(labelTalk)、发送按钮,聊天信息输入框(textTalk),在线人员下拉列表(ComboBox组合框)。

 

ChatClient:主类,实现客户端的主要功能

    // 窗口绘制
    public class ChatClient extendsJFrame
    // 建立与服务端通信的套接字
    void connectServer()
    // 监听事件
    public void actionPerformed(ActionEvent evt)

ClientThreat:处理聊天的类

 

2.2 服务器端

ChatServer:主类,服务器启动及监听;

    // 服务器启动及监听;
    public ChatServer()
    // 获取服务器的主机名和IP地址
    public void getServerIP()

ServerFrame:服务器窗口界面绘制

    // 服务器窗口绘制
    public ServerFrame()
    // Log信息保存
    protected void saveLog()

ServerProcess:服务器处理

// 处理与客户端连接的功能
    public ServerProcess(Socket client, ServerFrame frame)
// 判断是否有该注册用户
    private boolean isExistUser(Stringname)
// 判断用户的用户名密码是否正确
    private boolean isUserLogin(String name, String password)
// 用户注册
    private void register()
// 用户登陆
    private void login()
// 用户登陆成功
    private void userLoginSuccess(String name)
// 刷新在线用户列表
    private void freshClientsOnline()
// 用户关闭套接字,并将用户信息从在线列表中删除
    private String closeSocket()

3. 程序运行及说明


源码已经开源,地址位于: https://github.com/longluo/WebChat




摘 要 随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过服务器建立连接,来进行客户端客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统 关键词:局域网 聊天 socket java 聊天系统各功能模块 (1)服务器程序模块 服务器客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。 服务器线程源码: package qq.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*; import qq.dao.hibernate.IServiceDao; import qq.entity.*; public class ServerController { private User user; private Socket s; private IServiceDao dao; private ObjectInputStream ois; private ObjectOutputStream oos; private OnlineUser onlineUser; www.bylw120.com public ServerController(Socket s) { super(); dao=ServerMainClass.userDao; this.s = s; } public void handle() throws Exception { ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){ Request req=(Request)ois.readObject(); ois.read(); RequestType type=req.getType(); if(type.equals(RequestType.exit)){ exitHandle(); break; }else if(type.equals(RequestType.login)){ loginHandle(req); }else if(type.equals(RequestType.register)){ registerHandle(); }else if(type.equals(RequestType.offline)){ offlineHandle(); break; }else if(type.equals(RequestType.changeInformation)){ changeInformationHandle(); }else if(type.equals(RequestType.modifypasswd)){ modifypasswdHandle(req); }else if(type.equals(RequestType.sendMessage)){ sendMessageHandle(req); }else if(type.equals(RequestType.receiveFile)){ receiveFileHandle(req); }else if(type.equals(RequestType.sendFile)){ sendFileHandle(req); } } } private void modifypasswdHandle(Request req) { Long id=Long.parseLong(req.getData("id")); String oldpwd=req.getData("oldpwd"); String newpwd=req.getData("newpwd"); Response res=new Response(RequestType.modifypasswd); try { dao.updatePwd(id, oldpwd, newpwd); res.setData(1); try { oos.writeObject(res); } catch (IOException e) { e.printStackTrace(); } } catch (RuntimeException e) { try { oos.writeObject(res); } catch (IOException e1) { e1.printStackTrace(); } } } private void changeInformationHandle() { try { User user=(User)ois.readObject(); Response res=new Response(RequestType.changeInformation); try { dao.updateUser(user); res.setData(1);//修改成功返回值带一个整形值 oos.writeObject(res); oos.flush(); } catch (RuntimeException e) { oos.writeObject(res);//失败则返回值不带参数 oos.flush(); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void exitHandle() { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } //发送文件 private void sendFileHandle(Request req) { // try { // User u=(User)ois.readObject(); // // } catch (Exception e) { // e.printStackTrace(); // } } //接受文件 private void receiveFileHandle(Request req) {
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值