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

📄 server_thread.java

📁 Java编写即时聊天工具, 拥有注册登陆群聊私聊等功能, 程序包含完整的Document和测试运行环境
💻 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 + -