首先附上登录操作

登录界面就不说了,直说业务处理。当点击登录之后
/*
* 如果点击了登录按钮 首先判断帐号或者密码是否为空 然后封装为CommandTranser对象 向服务器发送数据 服务器通过与数据库的比对
* 来验证帐号密码
*/
if (e.getSource() == login) {
String username = text_name.getText().trim();
String password = new String(text_pwd.getPassword()).trim();
if ("".equals(username) || username == null) {
JOptionPane.showMessageDialog(null, "请输入帐号!!");
return;
}
if ("".equals(password) || password == null) {
JOptionPane.showMessageDialog(null, "请输入密码!!");
return;
}
User user = new User(username, password);
CommandTranser msg = new CommandTranser();
msg.setCmd("login");
msg.setData(user);
msg.setReceiver(username);
msg.setSender(username);
// 实例化客户端 并且发送数据 这个client客户端 直到进程死亡 否则一直存在
Client client = new Client();
client.sendData(msg);
msg = client.getData();
if (msg != null) {
if (msg.isFlag()) {
this.dispose();
JOptionPane.showMessageDialog(null, "登陆成功!");
// 显示好友列表界面
new FriendsUI(username, client);
} else {
JOptionPane.showMessageDialog(this, msg.getResult());
}
}
} else if (e.getSource() == sweep) {
text_name.setText(null);
text_pwd.setText(null);
}
}
把帐号密码 登录指令等封装为CommandTranser对象 然后实例化一个客户端 通过
sendData(CommandTranser msg)
方法向服务器发送数据 然后通过getData方法获得服务器返回的数据。
其中CommandTranser类在服务端已经介绍 主要变量如下
private String sender = null;// 发送者
private String receiver = null;// 接受者
private Object data = null;// 传递的数据
private boolean flag = false;// 指令的处理结果
private String cmd = null;// 服务端要做的指令
private String result = null;// 处理结果
客户端Client代码主要负责向服务端发送数据 sendData(CommandTranser msg) 和接收服务端的数据 getData()
构造方法
// 实例化时 建立连接
public Client() {
try {
socket = new Socket(address, port);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, "服务端未开启");
} catch (IOException e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, "服务端未开启");
}
}
sendData(CommandTranser msg)
方法
// 向服务端发送数据
public void sendData(CommandTranser msg) {
ObjectOutputStream oos = null;
try {
if (socket == null)
return;
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(msg);
} catch (UnknownHostException e1) {
JOptionPane.showMessageDialog(null, "服务端未开启");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "服务端未开启");
}
}
getData()方法
// 向服务端接收数据
public CommandTranser getData() {
ObjectInputStream ois = null;
CommandTranser msg = null;
if (socket == null)
return null;
try {
ois = new ObjectInputStream(socket.getInputStream());
msg = (CommandTranser) ois.readObject();
} catch (IOException e) {
return null;
} catch (ClassNotFoundException e) {
return null;
}
if ("message".equals(msg.getCmd()))
System.out.println((String) msg.getData());
return msg;
}
如果服务器返回登录成功的消息 则进入好友列表界面
在登录界面 所有的好友都是我自己创建的 。陌生人知识一个摆设。。当然也可以通过服务端的数据库来加载好友列表。。以后自己慢慢更新
这两天出现的各种各样的错误 头都炸了。。
而在好友界面 有一个鼠标双击事件 和鼠标进入好友列表,离开好友列表事件
当鼠标进入好友列表 改变背景色
// 如果鼠标进入我的好友列表 背景色变色
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
JLabel label = (JLabel) e.getSource();
label.setOpaque(true);
label.setBackground(new Color(255, 240, 230));
}
修改背景色之前 一定要设置为不透明 label.setOpaque(true);
不然看不到背景色
鼠标离开好友列表
// 如果鼠标退出我的好友列表 背景色变色
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
JLabel label = (JLabel) e.getSource();
label.setOpaque(false);
label.setBackground(Color.WHITE);
}
当双击好友后 出现聊天框
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// 如果双击了两次 我的好友 弹出与这个好友的聊天框
if (e.getClickCount() == 2) {
JLabel label = (JLabel) e.getSource();
new ChatUI(owner, label.getText(), client);
}
}
一旦打开聊天框 就要新建一个线程 时刻监听服务器发送的消息
thread = new ClientThread(client, chat_txt);
thread.start();
//当前 对话框存在
while (isOnline) {
//I/O阻塞 接收服务端发送的数据
CommandTranser msg = client.getData();
if (msg != null) {
/*
* 如果服务端处理数据成功 接收信息
* 否则 弹出对方不在线的对话框
*/
if (msg.isFlag()) {
//发送时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(
"yy-MM-dd hh:mm:ss a");
String message = msg.getSender() + "说:"
+ (String) msg.getData() + "\t" + sdf.format(date);
// 在聊天框添加收到的信息
chat_txt.append(message+"\n");
} else {
JOptionPane.showMessageDialog(chat_txt, msg.getResult());
}
}
}
而当点击了对话框的发送按钮时 将内容封装为CommandTrander对象 客户端向服务器发送数据
// 如果点击了发送按钮
if (e.getSource() == send_btn) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm:ss a");
String message = "你说:" + message_txt.getText() + "\t"
+ sdf.format(date);
// 在本地文本区追加发送的信息
chat_txt.append(message+"\n");
// msg为客户端向服务器发送的数据
CommandTranser msg = new CommandTranser();
msg.setCmd("message");
msg.setSender(owner);
msg.setReceiver(friend);
msg.setData(message_txt.getText());
client.sendData(msg);
// 发送信息完毕 写信息的文本框设空
message_txt.setText(null);
}
好啦 代码 就这么多。聊天过程如下