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

📄 chatserver.java

📁 聊天室源代码,可以实现多用户同时聊天,欢迎其他同行斧正
💻 JAVA
字号:
package net;

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

public class ChatServer {
	public static void main(String[] args) throws Exception{
		ServerSocket ss=new ServerSocket(9000);
		Map m=new HashMap();
		List onlinel=new LinkedList();  //在线用户
		BufferedReader in;
		while(true){		//侦听
			Socket s=ss.accept();
			try {
				in=new BufferedReader(new InputStreamReader(s.getInputStream()));
				String name=in.readLine();   //读到上线用户的姓名
				onlinel.add(name);    //加到在线用户的链表中
				m.put(name,s);			//用户姓名为key,其socket为value
				Thread t=new ChatThread(s,m,onlinel,name,in);
				t.start();
			} catch (IOException e) {
			}			
		}
	}
}

class ChatThread extends Thread{
	private Socket s;
	private Map m;
	private List l;
	private String name;
	private BufferedReader in;
	private PrintWriter out;
	private Set keys;
	public ChatThread(Socket s,Map m,List l,String name,BufferedReader in){
		this.s=s;
		this.m=m;
		this.name=name;
		this.in=in;
		this.l=l;
		keys=m.keySet();	//map的key集合
	}	
	public void run(){		
		//上线用户给所有的在线用户发他的姓名,以加入到各在线用户的下拉列表中
		Iterator it1=keys.iterator();  
		while(it1.hasNext()){
			Object key=it1.next();
			Socket so=(Socket)m.get(key);  //得到各在线用户的socket
			try {
				PrintWriter pw=new PrintWriter(so.getOutputStream());
				Iterator it2=l.iterator();
				while(it2.hasNext()){
					String online=(String)it2.next();
					if(online.equals(name)){
						pw.println("comIng"+name);
						pw.flush();
					}
					else {
						pw.println("JComboBox"+online);  //加JComboBox标识是姓名
						pw.flush();
					}
				}
			}catch(Exception e){
			}
		}
		
		while(true){
			try {
				String who=in.readLine();  //要发给谁
				String str=in.readLine();  //消息内容
				if(who==null||str==null) break;				

				if(m.containsKey(who)){   //map m中包含此姓名
					Socket so=(Socket)m.get(who);    //得到此人的socket
					out=new PrintWriter(so.getOutputStream());
					out.println(name+"说:"+str);    //转发
					out.flush();
				}
				else{					//发给所有人
					Iterator it3=keys.iterator();
					while(it3.hasNext()){
						Object key=it3.next();
						Socket so=(Socket)m.get(key);
						out=new PrintWriter(so.getOutputStream());
						out.println(name+"说:"+str);
						out.flush();
					}
				}
			} catch (IOException e) {
			}			
		}
		l.remove(name); //此用户下线,名字链表中删除此名字
		m.remove(name); //m中删除
		//此用户下线,发给其它在线用户的下线消息,并从下拉列表中删除其姓名
		Iterator it4=keys.iterator();
		while(it4.hasNext()){
			Object key=it4.next();
			Socket so=(Socket)m.get(key);
			try {
				out=new PrintWriter(so.getOutputStream());
			} catch (IOException e1) {
			}
			out.println(name+"退出聊天室");
			out.println("removeItem"+name);
			out.flush();
			try {
				s.close();
			} catch (IOException e) {
			}
		}
	}
}

⌨️ 快捷键说明

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