⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 这是一个使用Java编写的像QQ一样的即时通讯软件
💻 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 + -