package Chat; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; //必须可以接收多个客户端连接请求---多线程 //每当有一个客户端连接到服务器后,就把socket包装作为一个线程处理,不同的线程在不同的子线程中处理,互不影响--线程池 //难点1.如何保存多个客户端的连接 // 用Map实现,里面有键值对----ConcurrentHashMap<> ()--保证多线程注册时,用户名一定只有一个,保证其安全 // 多个用户能同时注册到服务器,线程如果不安全,用户名有可能重复,就导致之前注册的用户信息无效 public class MulThreadServer { //用来保存用户的客户端的列表 private static Map<String, Socket> clientMap = new ConcurrentHashMap<> (); //把socket包装作为一个线程,专门用来处理每个客户端的输入,输出请求 private static class ExecuteClientRequest implements Runnable { //需要接收一个客户端 private Socket client; public ExecuteClientRequest(Socket client) { this.client = client; } //具体处理每个客户端的输入输出请求 //服务器的作用,数据的转发 @Override public void run() { //获取用户输入流,读取用户发来的信息 try { Scanner in = new Scanner (client.getInputStream ()); //从用户发来的信息 String strFromClient = ""; //得不停的输入输出 while (true) { if (in.hasNext ()) { //获取到她的输入 strFromClient = in.nextLine (); //window下消除用户输入自带的\r //正则表达式,Pattern--表示识别的时那种格式 //将\r替换为空字符串 Pattern pattern = Pattern.compile ("\r"); Matcher matcher = pattern.matcher (strFromClient);//要替换的字符串放进去 strFromClient = matcher.replaceAll (""); } //根据输入的内容,分析是群聊信息还是私聊还是退出 //userName:wl------注册---到我的服务器 if (strFromClient.startsWith ("userName")) { //1.拆出用户名 String userName = strFromClient.split ("\\:")[1]; userRegister (userName, client); continue; } //G:----群聊内容 if (strFromClient.startsWith ("G:")) { String fromUserName = null; for (String keyName : clientMap.keySet ()) { if (clientMap.get (keyName).equals (client)) { fromUserName = keyName; } } String groupMsg = strFromClient.split ("\\:")[1]; groupChat (fromUserName, groupMsg); continue; } //P:私聊--告诉给谁发--用户名--私聊内容 if (strFromClient.startsWith ("P:")) {
聊天宝(升级版)
最新推荐文章于 2023-06-06 18:03:03 发布