当前位置: 首页 > news >正文

总结

多人聊天室

这个简单的聊天室示例允许多个客户端通过输入消息与服务器进行通信,服务器会将接收到的消息广播给所有连接的客户端。客户端和服务器之间的通信是基于Socket实现的。确保将服务器地址和端口号与你的实际配置相匹配。

 

package chatting;import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;public class ChatServer {private static final int PORT = 12345;private static Set<PrintWriter> clientWriters = new CopyOnWriteArraySet<>();public static void main(String[] args) {System.out.println("Chat Server is running...");ExecutorService pool = Executors.newFixedThreadPool(10);try (ServerSocket serverSocket = new ServerSocket(PORT)) {while (true) {new ClientHandler(serverSocket.accept(), pool).start();}} catch (IOException e) {e.printStackTrace();}}private static class ClientHandler extends Thread {private Socket socket;private PrintWriter out;private BufferedReader in;private ExecutorService pool;public ClientHandler(Socket socket, ExecutorService pool) {this.socket = socket;this.pool = pool;}public void run() {try {in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);clientWriters.add(out);String message;while ((message = in.readLine()) != null) {System.out.println("Received: " + message);broadcast(message);}} catch (IOException e) {e.printStackTrace();} finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}clientWriters.remove(out);}}private void broadcast(String message) {for (PrintWriter writer : clientWriters) {writer.println(message);}}}
}

class ChatClientUser {public static void main(String[] args) {final String SERVER_ADDRESS = "localhost";final int SERVER_PORT = 12345;try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)) {PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));Scanner scanner = new Scanner(System.in);Thread inputThread = new Thread(() -> {try {String userInput;while ((userInput = scanner.nextLine()) != null) {out.println(userInput);}} catch (Exception e) {e.printStackTrace();}});inputThread.start();String serverResponse;while ((serverResponse = in.readLine()) != null) {System.out.println("Received from server: " + serverResponse);}} catch (IOException e) {e.printStackTrace();}}
}class ChatClientUserA {public static void main(String[] args) {final String SERVER_ADDRESS = "localhost";final int SERVER_PORT = 12345;try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)) {PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));Scanner scanner = new Scanner(System.in);Thread inputThread = new Thread(() -> {try {String userInput;while ((userInput = scanner.nextLine()) != null) {out.println(userInput);}} catch (Exception e) {e.printStackTrace();}});inputThread.start();String serverResponse;while ((serverResponse = in.readLine()) != null) {System.out.println("Received from server: " + serverResponse);}} catch (IOException e) {e.printStackTrace();}}
}class ChatClientUserB {public static void main(String[] args) {final String SERVER_ADDRESS = "localhost";final int SERVER_PORT = 12345;try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)) {PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));Scanner scanner = new Scanner(System.in);Thread inputThread = new Thread(() -> {try {String userInput;while ((userInput = scanner.nextLine()) != null) {out.println(userInput);}} catch (Exception e) {e.printStackTrace();}});inputThread.start();String serverResponse;while ((serverResponse = in.readLine()) != null) {System.out.println("Received from server: " + serverResponse);}} catch (IOException e) {e.printStackTrace();}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis在SpringBoot中遇到的问题:预热,雪崩,击穿,穿透
  • kafka基础介绍
  • 卷与nfs实现多台主机容器之间的数据共享
  • 十、Docker版Redis集群搭建
  • DP学习——状态模式
  • idea将普通项目转换为maven项目
  • 使用JAVA代码实现生成二维码
  • windows网络应急排查
  • 以线程完成并发的UDP服务端
  • 使用kali对操作系统和网络服务类型进行探测
  • 列举excel中调整行高列宽的五种方法
  • Telegram曝零日漏洞,可伪装成视频攻击安卓用户
  • linux系统安装pytorch_中文地址命名实体识别案例
  • 使用Kafka Streams进行事件流处理
  • 实时视频流中的目标检测与跟踪:动态视觉的挑战与实现
  • 《深入 React 技术栈》
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Docker 笔记(2):Dockerfile
  • JavaScript类型识别
  • js中的正则表达式入门
  • Redis学习笔记 - pipline(流水线、管道)
  • Solarized Scheme
  • 什么是Javascript函数节流?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 问题之ssh中Host key verification failed的解决
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • (4.10~4.16)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (LLM) 很笨
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十)c52学习之旅-定时器实验
  • (四)鸿鹄云架构一服务注册中心
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (源码分析)springsecurity认证授权
  • (转)Unity3DUnity3D在android下调试
  • (状压dp)uva 10817 Headmaster's Headache
  • .chm格式文件如何阅读
  • .form文件_一篇文章学会文件上传
  • .Net CF下精确的计时器
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core Redis 使用有序集合实现延迟队列
  • .Net的DataSet直接与SQL2005交互
  • @Autowired和@Resource装配
  • @EnableWebSecurity 注解的用途及适用场景
  • @Service注解让spring找到你的Service bean
  • [100天算法】-不同路径 III(day 73)
  • [2]十道算法题【Java实现】
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [Android] Amazon 的 android 音视频开发文档
  • [Angular 基础] - 表单:响应式表单
  • [autojs]逍遥模拟器和vscode对接
  • [bzoj1901]: Zju2112 Dynamic Rankings