MOYchat--基于Swing的网络聊天室的设计实现
要求:
1、在IDEA中导入提供的Java工程“ChatRoom”,在其中完成后续设计实现。已提供的内容包括:
(1)MOYserver包:用于定义服务器端的功能,目前提供了服务器启动及响应客户端连接的功能,也是主要的客户端,每次使用的时候都要先去启动服务端,让电脑与本服务器进行连接,还有其他任务的实现功能我都写到注释里了。
(2)client包:用于定义客户端的功能,目前提供了dao包中的UserDao类,该类基于SQLog完成数据库相关操作,这部分属于扩展功能,非必须完成部分;service包中的Client类,该类用于发起对服务器的连接,并进行简单数据通信;
2、根据现有代码,自行设计完成关于聊天室的图形用户界面及功能响应,下面给出相关包的代码。
一、(1)ChatConstant包实现的功能是简单的实现在线人数的功能,比如他在本地客服端,如果是,然后去登录,那就是login,如果不是就会提示你错误,这时候你去运行下服务端就行。
package client;
/**
* 常量类//表示消息类型,就是简单的实现在线人数的功能
*/
public class ChatConstant {
//上报在线
public static final String ONLINE = "online";
//登录
public static final String LOGIN = "login";
//退出
public static final String LOGIN_OUT = "login_out";
//错误提示
public static final String ERROR_MSG = "error_msg";
//聊天
public static final String MSG = "msg";
}
(2)ClientChatUI是实现登录MOY这个界面所要实现的一些重点功能,比如文本框、按钮、以及登录时候窗体大小颜色等等,详细功能都以注释在下面。
package client;
/**
* MOY聊天窗口
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;//在这里也可以使用import java.io.*
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;//在这里也可以使用import java.util.*
public class ClientChatUI extends JFrame implements ActionListener, KeyListener {
private String userName;
private String friend;
//属性
//文本框
private JTextArea jta;
//滚动条
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按钮
private JButton jb;
private ObjectInputStream socketReader = null;
private ObjectOutputStream outputStream = null;
ClientHandle clientHandle = null;
public ClientChatUI(String userName, String friend,
ObjectInputStream socketReader, ObjectOutputStream outputStream) throws IOException {
this.userName = userName;
this.friend = friend;
this.socketReader = socketReader;
this.outputStream = outputStream;
//初始化UI
init();
outputStream.writeObject(new Message(ChatConstant.ONLINE, userName, "2", userName));
clientHandle = new ClientHandle(socketReader, jta, friend);
clientHandle.start();
}
//构造方法
public void init() {
//初始化组件
jta = new JTextArea();
//设置文本域默认不可编辑
jta.setEditable(false);
//注释:需要将文本框添加到滚动条中,实现滚动效果
jsp = new JScrollPane(jta);
//面板
jp = new JPanel();
jtf = new JTextField(10);
jb = new JButton("发送");
//注释:需要将文本框与按钮添加到面板中
jp.add(jtf);
jp.add(jb);
//注释:需要将滚动条与面板全部添加到窗体中
this.add(jsp, BorderLayout.CENTER);
this.add(jp, BorderLayout.SOUTH);
//注释:需要设置“标题、大小、位置、关闭,是否可见”
this.setTitle(String.format("与%s聊天...", friend));
this.setSize(400, 350);
// this.setLocation(500,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// this.setVisible(true);
//给发送按钮绑定一个监听事件
jb.addActionListener(this);
//给文本框绑定一个键盘点击事件
jtf.addKeyListener(this);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
outputStream.writeObject(new Message(ChatConstant.LOGIN_OUT, userName, null, null));
clientHandle.stop();
} catch (IOException ex) {
System.out.println("退出QQ异常" + ex.getMessage());
}
System.out.println(userName + " 退出QQ..");
}
});
setWindowsMiddleShow(this);
}
@Override
public void actionPerformed(ActionEvent e) {
reDataToSocket();
}
//行为 键盘监听
@Override
public void keyPressed(KeyEvent e) {
//回车键
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
//发送数据到socket,通道中
reDataToSocket();
}
}
//定义一个方法,实现将数据发送到socket中
private void reDataToSocket() {
//1.获取文本框中需要发送的数据内容
String text = jtf.getText();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2.拼接内容
jta.append("(我) " + formatter.format(new Date()) + System.lineSeparator());
//jta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // 设置组件方向为从右到左
//3.自己提示
jta.append(text + System.lineSeparato