package mtr.chat;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
public class ServerThread implements Runnable {
private String name;//客户端的名称
private Socket s;
private LinkedList<ServerThread> allClient;//存储客户端的集合
private ObjectInputStream ois ;//接受服务器发来的消息
private ObjectOutputStream oos ;//向服务器发送消息
private boolean flag = true;//用于控制线程的结束
private Message mg;
public ServerThread(Socket s,LinkedList<ServerThread> allClient) {
this.s = s;
this.allClient = allClient;
allClient.add(this);//将当前线程添加到集合中
}
@Override
public void run() {
try {
System.out.println("客户端 "+s.getInetAddress()+" 已上线!");
ois = new ObjectInputStream(s.getInputStream());
oos = new ObjectOutputStream(s.getOutputStream());
//用于保存聊天记录
PrintStream ps = new PrintStream(new FileOutputStream("./src/mtr/chatting/severRecords.txt",true), true);
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd HH:mm:ss] ") ;
String time = sdf.format(d);
while(flag) {
//接受客户端发过来的消息
mg = (Message) ois.readObject();
//判断客户端发过来的消息类型
Handle hand = mg.getHand();
switch (hand) {
//用户登陆
case LOAD:
name = mg.getFrom();//保存客户端用户名
mg.setNews("登陆成功,欢迎您!");//回复消息内容
oos.writeObject(mg);//回复客户端消息
ps.println("\n"+time+name+"已上线!");//保存记录
break;
//消息私发
case SEND:
for (ServerThread st : allClient) {
if(mg.getTo().equals(st.name)&&st!=this) {
st.oos.writeObject(mg);//将消息发送给对应的客户端
//保存聊天记录
ps.println(time+name+" 对 "+st.name+" 说:"+mg.getNews());
}
}
break;
case MASS:
for (ServerThread st : allClient) {
if(st!=this) {
st.oos.writeObject(mg);//将消息发送给对应的客户端
}
}
//保存一条聊天记录
ps.println(time+name+" 说:"+mg.getNews());
break;
//客户端下线
case EXIT:
mg.setNews("退出成功");//设置回复内容
oos.writeObject(mg);//回发客户端消息
flag = false;//设置退出线程
ps.println(time+name+"已下线!\n");//保存记录
allClient.remove(this);//将当前线程从集合中删除
break;
}
}
ps.close();
oos.close();
ois.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}