📄 server_thread.java
字号:
package service;
import java.io.*;
import java.net.*;
import java.util.*;
public class Server_thread extends Thread {
String name=null;
Socket socket=null;
public DataOutputStream outputstream=null;
public DataInputStream inputstream=null;
Hashtable peopleListAll=null;
String ID;
int serial;//登录用户序号
Server_thread(Socket t,String a,String b,int v){
socket=t;
ID=a;
name=b;
serial=v;
try{
inputstream=new DataInputStream(socket.getInputStream());
outputstream=new DataOutputStream(socket.getOutputStream());
ChatServer.peopleList.put(ID,this);//将当前线程添加到散列表,ID作为关键字
Enumeration enumer=ChatServer.peopleList.elements();//获取所有的与客户端通信的服务器线程
while(enumer.hasMoreElements()){
Server_thread th=(Server_thread)enumer.nextElement();//将当前上线用户通知给所有用户
th.outputstream.writeUTF("聊天者:"+name+"("+ID+")");
th.outputstream.writeUTF("上线:"+name+"("+ID+")上线");
if(th!=this){
outputstream.writeUTF("聊天者:"+th.name+"("+th.ID+")");//也将其他聊天者的姓名通知本线程
}
}
outputstream.writeUTF("注册者:"+this.name+"("+this.ID+")");
for(int i=0;i<ChatServer.r_number;i++){
if(i!=serial){
outputstream.writeUTF("注册者:"+ChatServer.register_inf[i].name+"("+ChatServer.register_inf[i].ID+")");
}
}
}
catch(IOException m){
System.out.print("不能成功建立输入输出流");
}
}
public void run(){
while(true){
String s=null;
try{//等待(阻塞本线程,直到收到消息)客户端发来的信息
s=inputstream.readUTF();
if(s.startsWith("公共聊天内容:"))
{
String message=s.substring(s.indexOf(":")+1);
Enumeration enumer=ChatServer.peopleList.elements();//获取所有与客户端通信的服务器线程
while(enumer.hasMoreElements()){
((Server_thread)enumer.nextElement()).outputstream.writeUTF("公共聊天内容:"+message);
}
for(int m=0;m<ChatServer.r_number;m++){
if(!ChatServer.register_inf[m].online){
ChatServer.register_inf[m].leavepublicmessage(message);
}
}
}
else if(s.startsWith("用户离开")){
Enumeration enumer=ChatServer.peopleList.elements();//获取所有与客户端通信的服务器线程
while(enumer.hasMoreElements()){
try{
Server_thread th=(Server_thread)enumer.nextElement();
if(th!=this&&th.isAlive()){
th.outputstream.writeUTF("用户离线:"+name+"("+ID+")");
}
}
catch(IOException eee){
}
}
ChatServer.peopleList.remove(ID);
ChatServer.register_inf[serial].online=false;
socket.close(); //关闭当前连接
System.out.println(name+"("+ID+")"+"用户离开了");
break;
}
else if(s.startsWith("私人聊天内容:")){
String secret=s.substring(s.indexOf(":")+1,s.indexOf("#"));
String toPeopleID=s.substring(s.indexOf("#")+1);
//找到要接收悄悄话的线程
Server_thread toThread=(Server_thread)ChatServer.peopleList.get(toPeopleID);
if(toThread!=null){
toThread.outputstream.writeUTF("私人聊天内容:"+secret);
}
else {
int leaveserial=0;
for(int n=0;n<ChatServer.r_number;n++){
if(ChatServer.register_inf[n].ID.equals(toPeopleID)) {
leaveserial=n;
break;
}
}
ChatServer.register_inf[leaveserial].leaveprivatemessage(secret);//Personinf类中目前最多留言支持100条,可以根据情况更改
}
}
}
catch(IOException ee){
Enumeration enumer=ChatServer.peopleList.elements();//通知其他在线聊天者该用户离线
while(enumer.hasMoreElements()){
try{
Server_thread th=(Server_thread)enumer.nextElement();
if(th!=this&&th.isAlive()){
th.outputstream.writeUTF("用户离线:"+name+"("+ID+")");
}
}
catch(IOException eee){
}
}
ChatServer.peopleList.remove(ID);
ChatServer.register_inf[serial].online=false;
try{
socket.close();//关闭当前连接
}
catch(IOException eee){
}
System.out.println(name+"("+ID+")"+"客户离开了");
break; //结束本线程工作,线程死亡
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -