📄 servthread.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 + -