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

📄 servthread.java

📁 聊天程序
💻 JAVA
字号:
package com.javahomework.Server;

import java.io.*;
import java.net.*;
import java.util.*;

import com.javahomework.Server.Log.*;

public class ServThread implements Runnable {
	private Socket socket;

	private DataInputStream din = null;

	private DataOutputStream dout = null;

	private String username = null;

	//
	public ServThread(Socket socket) {
		this.socket = socket;
		Thread _thread = new Thread(this);
		_thread.start();
	}

	public void run() {
		try {
			din = new DataInputStream(socket.getInputStream());
			dout = new DataOutputStream(socket.getOutputStream());
			synchronized (Server.threadList) {
				Server.threadList.add(this);
			}
			// Over and over, forever ...
			while (true) {

				String message = din.readUTF();
				parse(message);
				LogContent lc = new LogContent();
				lc.setContent(message);
				lc.setDate(new Date());
				lc.setIp(socket.getInetAddress().getHostAddress());
				lc.setPort(socket.getPort());
				Server.normalLoger.save(lc);
				//System.out.println(message);
			}

		} catch (EOFException ie) {
			// ie.printStackTrace();
			// This doesn't need an error message

		} catch (java.net.SocketException ie) {
			// ie.printStackTrace();
			// This doesn't need an error message
		} catch (IOException ie) {

			// This does; tell the world!
			ie.printStackTrace();
		} finally {
			System.out.print("client exited!!");
			Server.map.remove(username);
			Server.threadList.remove(this);
			try {
				if (din != null)
					din.close();
				if (socket != null)
					socket.close();
			} catch (Exception e) {

			}

		}
	}

	public synchronized void response(String msg) throws IOException {
		dout.writeUTF(msg);
		dout.flush();
	}

	private void parse(String message) throws IOException {// 命令分析函数(核心服务)
		if (message == null)
			return;
		if (message.startsWith("USER")) {// 收到USER命令
			USERCommand(message);
		} else if (message.startsWith("LIST")) {// 收到LIST命令
			LISTCommand();
		} else if (message.startsWith("TO")) {// 收到TO命令
			TOCommand(message);

		} else {// 为了兼容老师例子,无条件转发
			sendToAll(message);
		}

	}

	private void USERCommand(String msg) throws IOException {// USER命令的实现
		String[] msgs = msg.split(" ");
		if (msgs.length != 2) {
			response("502 username format error!!!");
			return;
		}

		username = msgs[1];
		synchronized (Server.map) {
			if (Server.map.get(username) == null) {
				Server.map.put(username, this);
				response("200 login success");
			} else {
				response("500 username has been used");
			}
		}
	}

	private void LISTCommand() throws IOException {
		// 构造返回给用户的响应
		// eg. RESPONSELIST USER1 USER2 USER3...
		synchronized (Server.map) {
			Set<String> keySet = Server.map.keySet();
			Iterator<String> iterator = keySet.iterator();
			String str = "RESPONSELIST";
			while (iterator.hasNext()) {
				String userName = iterator.next();
				str += " " + userName;
			}
			response(str);
		}

	}

	private void TOCommand(String msg) throws IOException {
		System.out.print(msg);
		String[] msgs = msg.split(" ");
		if (!(msgs.length > 2)) {
			response("500 invid command!");
		} else {
			String clientusername = msgs[1];
			synchronized (Server.map) {
				ServThread client = Server.map.get(clientusername);
				if (client == null) {
					// 用户名不存在
				} else {
					String content = "FROM " + username;
					for (int i = 2; i < msgs.length; i++) {
						content += " " + msgs[i];
					}
					client.response(content);// 通过相应的线程转发
				}
			}
		}

	}

	private void sendToAll(String msg) throws IOException {
		// 转发给所有用户
		synchronized (Server.map) {
			Iterator<ServThread> iterator = Server.threadList.iterator();
			while (iterator.hasNext()) {
				ServThread client = iterator.next();
				client.response(msg);
			}

		}
	}
}

⌨️ 快捷键说明

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