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

📄 chatserver.java

📁 这是一个使用Java编写的像QQ一样的即时通讯软件
💻 JAVA
字号:
package server;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

/**
 * 聊天服务端.负责监听并解析客户端的消息,.
 * @author user
 *
 */
public class ChatServer extends JFrame implements Runnable {

    /*
     * 服务端端口号的输入筐
     * 
     */
    public static JTextField textField;

    /**
     * 服务端Socket
     */
    public ServerSocket serverSocket;

    /**
     * 已经注册的用户
     */
    public Hashtable<Integer, People> friends;

    /**
     * 服务端ChatServer类的 ChatServer属性
     */
    public ChatServer chatServer;

    /**
     * 服务端多线程属性
     */
    public Thread thread;

    /**
     * 对messengeStore哈希表作为关键字号码的留言
     */
    public Hashtable<Integer, Vector<String>> messengeStore; 

    /**
     * 存放已经登陆的用户的Socket
     */
    public Hashtable<Integer, Socket> clients;

    public ChatServer() {

	super();

	this.setSize(400, 300);

	this.setLocation(460, 240);

	getContentPane().setLayout(null);

	setResizable(false);

	chatServer = this;

	serverSocket = null;

	clients = new Hashtable<Integer, Socket>();

	friends = new Hashtable<Integer, People>();

	messengeStore = new Hashtable<Integer, Vector<String>>();

	People people1 = new People();
	people1.number = 10;
	people1.password = "1";
	people1.name = "同易杰";
	people1.state = "不在线";
	people1.icon = "7.gif";
	friends.put(people1.number, people1);

	People people2 = new People();
	people2.number = 11;
	people2.password = "1";
	people2.name = "张超";
	people2.state = "不在线";
	people2.icon = "7.gif";
	friends.put(people2.number, people2);

	People people3 = new People();
	people3.number = 12;
	people3.password = "1";
	people3.name = "朱沧";
	people3.state = "不在线";
	people3.icon = "7.gif";
	friends.put(people3.number, people3);

	People people4 = new People();
	people4.number = 13;
	people4.password = "1";
	people4.name = "温亚男";
	people4.state = "不在线";
	people4.icon = "7.gif";
	friends.put(people4.number, people4);

	textField = new JTextField();
	textField.setBounds(183, 91, 125, 21);
	textField.setText("8000");
	getContentPane().add(textField);

	final JLabel label = new JLabel();
	label.setBounds(88, 91, 84, 21);
	label.setFont(new Font("宋体", Font.PLAIN, 14));
	label.setText("服务器的端口");
	getContentPane().add(label);

	final JButton startServerButton = new JButton();
	startServerButton.setBounds(109, 151, 63, 31);
	/**
	 * 启动服务按钮的响应程序
	 */
	startServerButton.addActionListener(new ActionListener() {
	    public void actionPerformed(final ActionEvent e) {

		try {

		    if (serverSocket != null) {

			JOptionPane.showMessageDialog(chatServer, "服务器已经启动了",
				"服务端", JOptionPane.INFORMATION_MESSAGE);

		    } else {

			JOptionPane.showMessageDialog(chatServer, "服务器启动. . .",
				"服务端", JOptionPane.INFORMATION_MESSAGE);
			
			/*
			 * 建立服务端的Socket
			 */
			serverSocket = new ServerSocket(new Integer(textField
				.getText().trim()));

			thread = new Thread(chatServer);

			thread.start();
		    }

		} catch (NumberFormatException e1) {

		    e1.printStackTrace();

		} catch (IOException e1) {

		    e1.printStackTrace();
		}

	    }
	});
	startServerButton.setText("启 动");
	getContentPane().add(startServerButton);

	final JButton closeServerButton = new JButton();
	closeServerButton.setBounds(214, 151, 63, 31);
	
	/**
	 * 关闭服务按钮的响应程序
	 */
	closeServerButton.addActionListener(new ActionListener() {

	    public void actionPerformed(final ActionEvent e) {

		try {

		    if (serverSocket == null) {

			JOptionPane.showMessageDialog(chatServer, "服务器已经关闭",
				"服务端", JOptionPane.INFORMATION_MESSAGE);
		    } else {

			JOptionPane.showMessageDialog(chatServer, "服务器关闭. . .",
				"服务端", JOptionPane.INFORMATION_MESSAGE);

			/*
			 * 停止服务端监听客户端的多线程
			 */
			thread.stop();

			thread = null;

			/*
			 * 关闭服务端的Socket
			 */
			serverSocket.close();

			serverSocket = null;
			
			/*
			 * 清空登陆的用户
			 */
			clients.clear();

		    }

		} catch (IOException e1) {

		    e1.printStackTrace();
		}
	    }
	});
	closeServerButton.setText("关 闭");
	getContentPane().add(closeServerButton);
	setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

    /*  
     * 该服务端是个多线程,该方法位Runable接口的方法
     * (非 Javadoc)
     * @see java.lang.Runnable#run()
     */
    public void run() {

	while (true) {

	    try {

		if (serverSocket.isClosed())
		    break;

		/*
		 * 监听到的和该服务端建立连接的客户端Socket
		 */
		Socket clientSocket = serverSocket.accept();
		
		/*
		 * 对该客户端的消息进行处理的多线程类
		 */
		Messenger messenger = new Messenger(clientSocket);

		messenger.start();

	    } catch (IOException e) {

		e.printStackTrace();
	    }
	}

    }

    /**
     * 负责处理某个客户端Socket发送和接受的消息
     * @author user
     *
     */
    class Messenger extends Thread {

	/**
	 * 给客户端发送消息的输出流
	 */
	private DataOutputStream sendToClient;

	/**
	 * 接受客户端消息的输入流
	 */
	private DataInputStream receiveFromClient;

	/**
	 * 被进行消息处理的客户端的Socket,
	 */
	private Socket clientSocket;

	/**
	 * 该客户端用户的号码
	 */
	private Integer clientNumber;

	Messenger(Socket socket) throws IOException {

	    clientSocket = socket;

	}

	/*
	 * (非 Javadoc)
	 * @see java.lang.Thread#run()
	 */
	public void run() {

	    try {
		/*
		 * 解析客户端的请求
		 */
		while (true) {

		    receiveFromClient = new DataInputStream(clientSocket
			    .getInputStream());

		    sendToClient = new DataOutputStream(clientSocket
			    .getOutputStream());

		    String requestFromClient = receiveFromClient.readUTF();

		    StringTokenizer st = new StringTokenizer(requestFromClient,
		    "@");

		    String startWord = st.nextToken();
		    Integer number = new Integer(st.nextToken());

		    /*
		     * 登陆请求
		     */
		    if (startWord.equals("Login")) {

			String password = st.nextToken();

			/*
			 * 如果密码正确,返回密码正确信息
			 */
			if (friends.containsKey(number)) {

			    if (password
				    .equals(((People) friends.get(number)).password)) {

				clientNumber = number;

				sendToClient = new DataOutputStream(
					clientSocket.getOutputStream());

				sendToClient.writeUTF("Password@Right");

				/*
				 * 如果用户名存在且密码正确则给每个当前在线用户发送次好友登陆消息
				 */
				Object[] keyArray = clients.keySet().toArray();
				for (int index = 0; index < keyArray.length; index++) {

				    Socket tempSocket = (Socket) clients
				    .get(keyArray[index]);

				    receiveFromClient = new DataInputStream(
					    tempSocket.getInputStream());

				    sendToClient = new DataOutputStream(
					    tempSocket.getOutputStream());

				    /*
				     * login@ 表示number 这个用户成功登陆
				     */
				    sendToClient.writeUTF("Login@" + number
					    + "@上线了");
				}

				/*
				 * 返回该用户的好友列表 返回好友的号码 其它资料从数据库读取
				 */
				{
				    sendToClient = new DataOutputStream(
					    clientSocket.getOutputStream());

				    Object[] friendsArray = friends.keySet()
				    .toArray();

				    for (int index = 0; index < friendsArray.length; index++) {

					sendToClient
					.writeUTF("Friends@"
						+ friends
						.get(friendsArray[index]).number
						+ "@"
						+ friends
						.get(friendsArray[index]).name
						+ "@"
						+ friends
						.get(friendsArray[index]).icon);
				    }

				    sendToClient.writeUTF("FriendsAll@ww");

				}

				clients.put(number, clientSocket);

				Vector<String> leaveMessenge = messengeStore.get(number);
				if (leaveMessenge != null) {

				    for (int i = 0; i < leaveMessenge.size(); i++) {

					sendToClient.writeUTF("Messeng@"
						+ leaveMessenge.get(i));
				    }

				    messengeStore.remove(number);
				}

			    }

			    /*
			     * 如果密码错误,给登陆者返回密码错误信息
			     */
			    else {
				sendToClient.writeUTF("Password@Error");
			    }

			} else {
			    /*
			     * 号码不存在
			     */
			    sendToClient.writeUTF("Password@Error");
			}
		    }
		    /*
		     * 给某人发消息
		     */
		    else if (startWord.equals("Speakto")) {

			/*
			 * 如果该好友在线
			 */
			if (clients.get(number) != null) {

			    Socket tempSocket = (Socket) clients.get(number);

			    sendToClient = new DataOutputStream(tempSocket
				    .getOutputStream());

			    sendToClient.writeUTF("Messeng@" + st.nextToken()
				    + "@" + st.nextToken());

			} else {

			    Integer senderNumber = new Integer(st.nextToken());
			    Integer receiverNumber = number;
			    String receiverMessenge = senderNumber + "@"
			    + st.nextToken();

			    Socket tempSocket = (Socket) clients
			    .get(senderNumber);

			    sendToClient = new DataOutputStream(tempSocket
				    .getOutputStream());

			    sendToClient.writeUTF("Messengreturn@" + number
				    + "@" + "不在线");

			    /*
			     * 存储该信息,等到该好友上线,自动发送此消息
			     */

			    if (messengeStore.get(number) == null) {

				Vector<String> messenge = new Vector<String>();
				messenge.add(receiverMessenge);

				messengeStore.put(receiverNumber, messenge);

			    } else {

				messengeStore.get(receiverNumber).add(
					receiverMessenge);
			    }

			}
			/*
			 * 邀请number参加群聊
			 */
		    } else if (startWord.equals("GroupTalkInvite")) {

			if (clients.get(number) != null) {

			    Socket tempSocket = (Socket) clients.get(number);

			    sendToClient = new DataOutputStream(tempSocket
				    .getOutputStream());

			    sendToClient.writeUTF(requestFromClient);
			}

			/*
			 * 发送群聊消息
			 */
		    } else if (startWord.equals("GroupMesseng")) {

			if (clients.get(number) != null) {

			    Socket tempSocket = (Socket) clients.get(number);

			    sendToClient = new DataOutputStream(tempSocket
				    .getOutputStream());

			    sendToClient.writeUTF("GroupMesseng@"
				    + st.nextToken() + "@" + st.nextToken()
				    + "@" + st.nextToken());
			}

		    } else if (startWord.equals("Exit")) {

			clients.remove(clientNumber);
			clientSocket.close();

			receiveFromClient.close();
			sendToClient.close();
			break;
		    }

		}

	    } catch (IOException e) {

	    } finally {

		try {

		    /*
		     * 该用户退出
		     */
		    if (clients.containsKey(clientNumber)) {

			clients.remove(clientNumber);

			clientSocket.close();

			receiveFromClient.close();

			sendToClient.close();
		    }

		} catch (IOException e) {

		    e.printStackTrace();
		}

	    }
	}
    }

    public static void main(String[] args) throws IOException {

	ChatServer server = new ChatServer();

	server.setVisible(true);

    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -