客户端

package project.java;
//客户端
//输入、输出流分别为处于一个线程import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;class OutToServer2 implements Runnable{private Socket client;public OutToServer2(Socket client) {super();this.client = client;}@Overridepublic void run() {PrintStream printStream;try {printStream = new PrintStream(client.getOutputStream(),true);Scanner scanner = new Scanner(System.in);scanner.useDelimiter("\n");while(true) {System.out.println("请输入:");while(scanner.hasNext()) {String string = scanner.nextLine();printStream.println(string);if(string.equals("拜拜")) {System.out.println("客户端退出");printStream.close();scanner.close();//client.close();break;}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class ReadFromServer2 implements Runnable{private Socket client;public ReadFromServer2(Socket client) {super();this.client = client;}public void run() {try {Scanner scanner = new Scanner(client.getInputStream());scanner.useDelimiter("\n");while(scanner.hasNext()) {System.out.println("服务器端输入:"+scanner.nextLine());}} catch (IOException e) {e.printStackTrace();}}}public class SingelClient2 {public static void main(String[] args) {String serverName = "127.0.0.1";int port = 6666;Socket client;try {client = new Socket(serverName,port);Thread ouThread = new Thread(new OutToServer2(client));Thread inThread = new Thread(new ReadFromServer2(client));ouThread.start();inThread.start();} catch (Exception e) {e.printStackTrace();} }
}

服务器端

package project.java;import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//服务器端
/*** Map<String,Socket>* 用户注册:username:yyy* 群聊:G:hello* 私聊:P:yyy-hhh
*/class  ExcuteClientServer1 implements Runnable{private Socket client;private Map<String,Socket> clientMap;public ExcuteClientServer1(Socket client, Map<String, Socket> clientMap) {super();this.client = client;this.clientMap = clientMap;}public void run() {try {//拿到客户端输入流,读取用户信息Scanner scanner = new Scanner(client.getInputStream());String string = null;while(true){if(scanner.hasNext()) {string = scanner.nextLine();Pattern pattern = Pattern.compile("\r\n|\r|\n");Matcher matcher = pattern.matcher(string);string = matcher.replaceAll("");//用户注册if(string.startsWith("user")) {//获取用户名String useName = string.split("\\:")[1];userRegist(useName, client);continue;}//群聊else if(string.startsWith("G")) {String message = string.split("\\:")[1];gropChat(message);continue;}//私聊else if(string.startsWith("P")) {String temp = string.split("\\:")[1];//取得用户名String useName = temp.split("\\-")[0];//取得消息内容String message = temp.split("\\-")[1];privateChat(useName, message);continue;}//用户退出else if(string.contains("拜拜")) {//先根据Socket知道用户名String useName = getUseName(client);System.out.println("用户名为"+useName +"的用户下线了!!!");clientMap.remove(useName);continue;}} }}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//获取key值(即由端口号找到用户名)public String getUseName(Socket socket) {String useName = null;for(String getKey : clientMap.keySet()) {if(clientMap.get(getKey).equals(socket)) {useName = getKey;}}return useName;}//注册实现public void userRegist(String useName,Socket client) {System.out.println("用户姓名为:" + useName);System.out.println("用户socket为:" + client);System.out.println("用户名为"+ useName +"的用户上线了!");System.out.println("当前用户数为:"+ (clientMap.size()+1) +"人");clientMap.put(useName, client);}//群聊实现public void gropChat(String message) {Iterator<Entry<String, Socket>> iterable = clientMap.entrySet().iterator();for(Map.Entry<String, Socket> stringSocketEntry:clientMap.entrySet()) {try {Socket socket = stringSocketEntry.getValue();PrintStream printStream = new PrintStream(socket.getOutputStream(),true);System.out.println("用户说"+message);    printStream.println(message);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//私聊实现public void privateChat(String useName,String message) {//根据对应的useName找到对应的SocketSocket privateSocket = clientMap.get(useName);try {PrintStream printStream = new PrintStream(privateSocket.getOutputStream());printStream.println("用户名为"+getUseName(client)+"的用户对你说:"+message);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}public class SingleServer2 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(6666);//存取用户信息(用户名和Socket)Map<String, Socket> map = new HashMap<String, Socket>();//线程池,线程大小为20ExecutorService executorService =Executors.newFixedThreadPool(20);System.out.println("等待客户连接中...");try {for(int i = 0;i < 20;i ++) {Socket socket = serverSocket.accept();System.out.println("有新的用户连接:"+socket.getInetAddress()+socket.getPort());executorService.execute(new ExcuteClientServer1(socket,map));}executorService.shutdown();serverSocket.close();} catch (Exception e) {}}
}

Java聊天室——实现多人聊天、私聊、群聊相关推荐

  1. h5移动端聊天室|仿微信界面聊天室|h5多人聊天室

    今年的FIFA世界杯甚是精彩,最近兴致高涨就利用HTML5开发了一个手机端仿微信界面聊天室,该h5聊天室采用750px全新伸缩flex布局,以及使用rem响应式配合fontsize.js,页面弹窗则是 ...

  2. C++搭建集群聊天室(十四):群聊功能

    文章目录 群聊功能思路 放码过来 groupuser.hpp group.hpp groupmodel.hpp groupmodel.cpp 群聊功能思路 1.创建群聊,提交群信息,返回群号 2.拉取 ...

  3. 微信小程序之聊天室(多人聊天室)总结

    实现方式一: 使用nodejs + socket.io实现 缺点:引用weapp.socket.io.js 大小100kb 实现方式二: 使用小程序云开发- 数据库实时监听 来实现 缺点:目前不可以跨 ...

  4. javaWeb实现聊天室(私聊+群聊)

    写在前面 近几天,迎来了第一个小项目,不做不知道,一做吓一跳.好多知识都掌握的不够扎实,看似会了,但其实似懂非懂,不能真正掌握原理,导致使用起来错误百出.而且深深体会到,知识只有到用时方恨少,一个简单 ...

  5. Java Socket实现简易多人聊天室传输聊天内容或文件

    Java Socket实现简易多人聊天室传输聊天内容或文件 Java小练手项目:用Java Socket实现多人聊天室,聊天室功能包括传输聊天内容或者文件.相比于其它的聊天室,增加了传输文件的功能供参 ...

  6. Java websocket + redis 实现多人单聊天室,多人多聊天室, 一对一聊天

    多人,单聊天室版 FEATURE 多人聊天, 界面简洁美观, 使用ueditor支持发送文字,图片信息 群聊成员列表, 登入登出公告 存储聊天记录, 查看历史消息 技术点 使用CopyOnWriteM ...

  7. SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    SpringBoot与webSocket实现在线聊天室--实现私聊+群聊+聊天记录保存 引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/det ...

  8. java仿qq聊天系统 多人聊天室

    目录 项目介绍 项目截图 服务器与客户端 新用户注册 注册新账号成功 进入聊天室 多人在线 选择发送文件 文件接收提醒 项目代码参考 服务器入口程序 服务器请求处理 原理解析 服务器多人网络连接: 如 ...

  9. java控制台输出版多人聊天室

    多人聊天室就要用到网络以及多线程以及输入输出流的知识 多人聊天室就是多个人同时聊天,一个发一条信息所有人都是可以接收得到. 接下来我们捋清楚一下思路 在这里面服务器充当了一个转发的作用,服务器要做的事 ...

最新文章

  1. vue中常碰见的坑_Vue 与 Vuex 的第一次接触遇到的坑
  2. jvm类加载机制_面试:对于JVM类加载机制深度解析
  3. python tab符号_Python3 expandtabs()方法
  4. Unix/Linux操作系统中如何在sqlplus/rman中使用方向键
  5. Android后台强制结束进程,Application入口或者activity回调的是哪个方法?
  6. ldconfig mysql_ldconfig命令介绍
  7. 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间
  8. 交钱赎“人”!B站500万粉UP主被黑客勒索,腾讯都表示无解
  9. python url解析path_Django(CBV解析、模板层)
  10. java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
  11. 【考研英语】考研英语小作文万能模板(致歉信)
  12. 同居mm_倾向于同居
  13. 任正非:不惑之年创立华为是生活所迫,CEO真不是人干的活
  14. shoug oracle,SHOUG User Group Young Expert Program
  15. Python3 遇到\\u开头的编码
  16. OpenCL与OpenACC的安装
  17. 数据中心分析诊断必备之常用仪表
  18. VB封装的WebSocket模块,拿来即用
  19. 最长回文 HDU - 3068 马拉车算法
  20. 设置电脑主机ip地址

热门文章

  1. 华南理工大学珠海学院计算机,慕了!盘点那些有“私家游泳池”的广东高校!考上就算捡到啦!...
  2. SSL 2344 洛谷 2835 信息学奥赛一本通 1383 刻录光盘#floyd,tarjan,kosaraju#
  3. 小程序云开发学习笔记(二)
  4. Web3 网络效应:五种心智模型
  5. java自动发图文微博_使用node搭建自动发图文微博机器人的方法
  6. 力扣(15.18)补9.19
  7. 车内贵重物品检测方案总结
  8. 人工智能的历史与未来,主要划分为了哪三个阶段
  9. centos7离线安装软件和软件包组
  10. HTML怎么设置自动滚动的图片,转:HTML中让图片滚动的marquee标签的使用方法