📄 client.java
字号:
package client;
import java.applet.AudioClip;
import java.awt.Component;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListCellRenderer;
import com.swtdesigner.SwingResourceManager;
public class Client extends Thread {
/*
* 好友登陆的提示筐
*/
private LoginPrompt loginPrompt;
/*
* 显示好友的好友列表的好友面板
*/
private ChatInterface chatInterface;
/*
* 父界面 主要用于让消息提示显示在父界面的中央
*/
private JFrame parentFrame;
/*
* 从服务端接受消息的输入流
*/
DataInputStream receiveFromServer;
/*
*给服务端发消息的输入流
*/
DataOutputStream sendToServer;
/*
* 当前打开的和好友聊天的界面
*/
public static Hashtable<Integer, TalkInterface> talkInterfaces;
/*
* 当前打开的和好友群聊的界面
*/
public static Hashtable<Integer, TalkInterface> grouptalkInterfaces;
/*
* 群聊界面 和 邀请群聊的好友的号码 建立起来的hashtable
*/
public static Hashtable<Integer, Integer> mapGrouptalkInterfaces;
/*
* 正在群聊的的界面的 ID
*/
public static Vector<Integer> groupTalkInterfaceIds;
/*
*存放已经关闭的群聊窗口的ID(群聊界面的ID号的分配时用)
* 分配id的步骤:
* 邀请着邀请时,如果tempGroupTalkInterfaceIds为空,则在groupTalkInterfaceIds新添加一个ID,分配给该界面.
* 如果tempGroupTalkInterfaceIds不为空,则将tempGroupTalkInterfaceIds最后一个ID分配给该界面
* 这样做主要是避免群聊窗口的Id过大
*/
public static Vector<Integer> tempGroupTalkInterfaceIds;
/*
* 该客户端用户的 号码
*/
public static Integer number;
/*
* 该用户的好友
*/
public static Hashtable<Integer, String> goodFriends; // 所有好友
/*
* 用户头像信息
*/
public static Hashtable<Integer, String> friendIcon;
/*
* 收到好友信息时,头像闪烁的定时器,提醒自己该好友给自己发送了消息.
*/
public static Hashtable<Integer, Timer> timerHashtable;
/*
* 好友对自己的留言
*/
public static Hashtable<Integer, Vector<String>> messengeOfFriends;
public Client(DataInputStream receiveFromServer,
DataOutputStream sendToServer, JFrame frame, Integer num) {
parentFrame = frame;
goodFriends = new Hashtable<Integer, String>();
friendIcon = new Hashtable<Integer, String>();
groupTalkInterfaceIds = new Vector<Integer>();
tempGroupTalkInterfaceIds = new Vector<Integer>();
mapGrouptalkInterfaces = new Hashtable<Integer, Integer>();
timerHashtable = new Hashtable<Integer,Timer>();
messengeOfFriends = new Hashtable<Integer, Vector<String>>();
this.receiveFromServer = receiveFromServer;
this.sendToServer = sendToServer;
talkInterfaces = new Hashtable<Integer, TalkInterface>();
grouptalkInterfaces = new Hashtable<Integer, TalkInterface>();
number = num;
}
public void run() {
while (true) {
try {
String messengeFromServer = receiveFromServer.readUTF();
StringTokenizer messengeST = new StringTokenizer(
messengeFromServer, "@");
String startWord = messengeST.nextToken();
String nextWord = messengeST.nextToken();
/*
* 别的用户登陆
*/
if (startWord.equals("Login")) {
Integer number = new Integer(nextWord);
loginPrompt = new LoginPrompt(parentFrame);
loginPrompt.setVisible(true);
loginPrompt.label_1
.setText(goodFriends.get(number) + "上线了");
}
/*
* 自己登陆成功
*/
else if (startWord.equals("Password")
&& nextWord.equals("Right")) {
}
/*
* 密码有误
*/
else if (startWord.equals("Password")
&& nextWord.equals("Error")) {
JOptionPane.showMessageDialog(parentFrame, "密码错误", "连接失败",
JOptionPane.ERROR_MESSAGE);
}
/*
* 得到好友列表
*/
else if (startWord.equals("Friends")) {
Integer friendNumber = new Integer(nextWord);
String friendName = messengeST.nextToken();
String icon = messengeST.nextToken();
friendIcon.put(friendNumber, icon);
goodFriends.put(friendNumber, friendName);
} else if (startWord.equals("FriendsAll")) {
chatInterface = new ChatInterface(sendToServer);
chatInterface.setTitle(goodFriends.get(number));
chatInterface.setVisible(true);
parentFrame.dispose();
}
/*
* 收到好友消息
*/
else if (startWord.equals("Messeng")) {
Integer messengerNumber = new Integer(nextWord);
String messengerName = goodFriends.get(messengerNumber);
/*
* 收到消息的声音提示
*/
URL file = getClass().getResource("chimes.wav"); //声音文件2
AudioClip sound = java.applet.Applet.newAudioClip(file); //声音剪辑对象1
sound.play();
TalkInterface talkInterface = talkInterfaces.get(messengerNumber);
if (talkInterface == null) {
//选中那个好友
DefaultListModel listModel = chatInterface.listModel;
int index = listModel.indexOf(messengerNumber + "@"
+ messengerName + "@"
+ friendIcon.get(messengerNumber));
if(timerHashtable.get(messengerNumber) == null){
TaskMessenge timeTask = new TaskMessenge(index);
Timer timer = new Timer();
timer.schedule(timeTask, 0, 500);
timerHashtable.put(messengerNumber, timer);
}
if(messengeOfFriends.get(messengerNumber) == null){
Vector<String> messenge = new Vector<String>();
messenge.add(messengeST.nextToken());
messengeOfFriends.put(messengerNumber, messenge);
}else{
messengeOfFriends.get(messengerNumber).add(messengeST.nextToken());
}
} else {
talkInterfaces.get(messengerNumber).textPane.setText(talkInterface.textPane.getText()
+ messengerName
+ messengeST.nextToken() + "\n");
talkInterfaces.get(messengerNumber).textPane.setSelectionStart(talkInterface.textPane
.getText().length());
}
}
/*
* 被邀情群聊
*/
else if (startWord.equals("GroupTalkInvite")) {
TalkInterface talkInterface = new TalkInterface(
sendToServer);
Integer groupTalkInterfaceId;
if (tempGroupTalkInterfaceIds.isEmpty()) {
groupTalkInterfaceId = groupTalkInterfaceIds.size();
groupTalkInterfaceIds.add(Client.groupTalkInterfaceIds
.size());
} else {
groupTalkInterfaceId = tempGroupTalkInterfaceIds
.lastElement();
groupTalkInterfaceIds.add(tempGroupTalkInterfaceIds
.lastElement());
tempGroupTalkInterfaceIds
.remove(tempGroupTalkInterfaceIds.size() - 1);
}
talkInterface.groupTalkInterfaceId = groupTalkInterfaceId;
grouptalkInterfaces
.put(groupTalkInterfaceId, talkInterface);
Integer numberOfInviterWindowId = new Integer(messengeST
.nextToken());
talkInterface.inviterNumber = numberOfInviterWindowId;
mapGrouptalkInterfaces.put(numberOfInviterWindowId,
groupTalkInterfaceId);
System.out.println("收到:" + messengeFromServer);
Vector<String> friendList = new Vector<String>();
Integer friendNumber;
while (messengeST.hasMoreTokens()) {
friendNumber = new Integer(messengeST.nextToken());
if (!friendNumber.equals(number)) {
talkInterface.talkingFriends.add(friendNumber);
friendList.add(friendNumber + "@"
+ goodFriends.get(friendNumber));
}
}
talkInterface.setTitle("你在与多人聊天");
talkInterface.list.setListData(friendList);
talkInterface.setVisible(true);
}
/*
* 收到群聊消息
*/
else if (startWord.equals("GroupMesseng")) {
Integer messengerNumber = new Integer(nextWord);// 说话好友的号码
String messengerName = goodFriends.get(messengerNumber);// 说话好友的姓名
Integer numberOfInviterWindowId = new Integer(messengeST
.nextToken());// 群聊的窗口ID
String messenge = messengeST.nextToken();// 收到的消息
System.out.println("收到消息:" + messengeFromServer);
TalkInterface talkInterface = grouptalkInterfaces
.get(mapGrouptalkInterfaces
.get(numberOfInviterWindowId));
if (talkInterface != null) {
talkInterface.textPane.setText(talkInterface.textPane
.getText()
+ messengerName + messenge + "\n");
talkInterface.textPane
.setSelectionStart(talkInterface.textPane
.getText().length());
} else {
System.out.println("原来在折:" + messengeFromServer);
}
}
/*
* 好友发送失败
*/
else if (startWord.equals("Messengreturn")) {
Integer messengerNumber = new Integer(nextWord);
String messengerName = goodFriends.get(messengerNumber);
TalkInterface talkInterface = talkInterfaces
.get(messengerNumber);
if (talkInterface == null) {
String title = Client.goodFriends.get(Client.number)
+ " 和 " + messengerName + " 聊天";
talkInterface = new TalkInterface(sendToServer);
talkInterface.setTitle(title);
talkInterface.talkingNumber = messengerNumber;
talkInterface.talkingFriends.add(messengerNumber);
talkInterface.textPane.setText("系统消息: "
+ messengerName + "不在线\n");
talkInterface.textPane
.setSelectionStart(talkInterface.textPane
.getText().length());
talkInterfaces.put(messengerNumber, talkInterface);
Vector<String> talking = new Vector<String>();
for (int i = 0; i < talkInterface.talkingFriends.size(); i++) {
talking.add(talkInterface.talkingFriends.get(i)
+ "@"
+ Client.goodFriends
.get(talkInterface.talkingFriends
.get(i)));
}
talkInterface.list.setListData(talking);
} else {
talkInterfaces.get(messengerNumber).textPane
.setText(talkInterface.textPane.getText()
+ "系统消息: " + messengerName + "不在线\n");
talkInterfaces.get(messengerNumber).textPane
.setSelectionStart(talkInterface.textPane
.getText().length());
}
}
} catch (SocketException se) {
JOptionPane.showMessageDialog(chatInterface, "与服务器断开了连接", "QQ",
JOptionPane.ERROR_MESSAGE);
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
/**
* 收到好友信息时,好友头像闪烁的定时器
* @author user
*
*/
class TaskMessenge extends TimerTask {
private int indexOfList;
private DefaultListModel listModel;
private boolean state;
private String object;
public TaskMessenge(int index) {
indexOfList = index;
listModel = chatInterface.listModel;
state = true;
object = (String) listModel.get(indexOfList);
}
public void run() {
if(state){
String tempObject = object;
tempObject = object.substring(0,object.lastIndexOf("@")+1)+"bai.gif";
listModel.setElementAt(tempObject, indexOfList);
state = false;
}else{
listModel.setElementAt(object, indexOfList);
state = true;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -