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

手撸一个java简易聊天室

创建一个Java聊天室涉及到网络编程、多线程处理以及用户界面设计。这里我将提供一个简单的Java聊天室实现,包括服务器端和客户端的基本逻辑。
服务器端
服务器端负责接收客户端的消息,并将其广播给所有连接的客户端。
java
复制
import java.io.;
import java.net.
;
import java.util.*;

public class ChatServer {
private static final int PORT = 6789;
private static List clients = Collections.synchronizedList(new ArrayList<>());

public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(PORT);System.out.println("Chat server started on port " + PORT);while (true) {try (Socket clientSocket = serverSocket.accept()) {System.out.println("New client connected: " + clientSocket.getRemoteSocketAddress());ClientHandler clientHandler = new ClientHandler(clientSocket);clients.add(clientHandler);clientHandler.start();}}
}public static void broadcastMessage(String message) {for (ClientHandler client : clients) {client.sendMessage(message);}
}private static class ClientHandler extends Thread {private Socket clientSocket;private PrintWriter out;public ClientHandler(Socket socket) {this.clientSocket = socket;}@Overridepublic void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));out = new PrintWriter(clientSocket.getOutputStream(), true);String inputLine;while ((inputLine = in.readLine()) != null) {broadcastMessage(inputLine);}} catch (IOException e) {System.out.println("Error in client handler: " + e.getMessage());} finally {try {clientSocket.close();} catch (IOException e) {e.printStackTrace();}clients.remove(this);}}public void sendMessage(String message) {out.println(message);}
}

}
客户端
客户端负责连接服务器,发送消息,并接收服务器广播的消息。
java
复制
import java.io.;
import java.net.
;
import java.util.Scanner;

public class ChatClient {
private static final String HOST = “localhost”;
private static final int PORT = 6789;

public static void main(String[] args) throws IOException {try (Socket socket = new Socket(HOST, PORT);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));Scanner scanner = new Scanner(System.in)) {System.out.println("Connected to the chat server");// Receive messages from the servernew Thread(() -> {try {String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println(inputLine);}} catch (IOException e) {e.printStackTrace();}}).start();// Send messages to the serverwhile (scanner.hasNextLine()) {String userMessage = scanner.nextLine();out.println(userMessage);}}
}

}
运行说明
首先运行 ChatServer 类,它将启动服务器并等待客户端连接。
然后运行一个或多个 ChatClient 实例,它们将连接到服务器并允许用户输入消息。
用户在客户端输入的消息将被发送到服务器,服务器将广播给所有连接的客户端。
注意事项
这个聊天室实现是多线程的,每个客户端连接都会创建一个新的线程。
客户端和服务器之间的通信使用TCP协议。
这个实现是基本的,没有考虑异常处理、断线重连、用户身份验证等高级特性。
为了更好的用户体验,你可以考虑添加图形用户界面(GUI),使用Swing或JavaFX等库。
这个聊天室是一个基础的示例,可以根据你的需要进行扩展和改进。

相关文章:

  • 【UML用户指南】-13-对高级结构建模-包
  • Windows 搭建C++ 纯开源开发环境 进行 YOLOv8 模型推理的开发测试环境
  • 快速开始一个go程序(极简-快速入门)
  • 基于R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析
  • Java24:会话管理 过滤器 监听器
  • 深度解析地铁票务系统的技术架构与创新应用
  • 技术人如何打造研发团队
  • 安利一款非常不错浏览器文本翻译插件(效果很不错,值得一试)
  • 【数据结构】图之邻接矩阵代码实现与dfs、bfs
  • c语言:自定义类型(枚举、联合体)
  • 网络流媒体协议——HLS协议
  • MySQL实体类框架
  • OpenGauss数据库-7.用户及角色
  • Vue3【十五】标签的Ref属性
  • select模块
  • 【知识碎片】第三方登录弹窗效果
  • 30秒的PHP代码片段(1)数组 - Array
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • fetch 从初识到应用
  • JavaScript-Array类型
  • MobX
  • SOFAMosn配置模型
  • windows-nginx-https-本地配置
  • 前端性能优化--懒加载和预加载
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 全栈开发——Linux
  • 我的zsh配置, 2019最新方案
  • 智能合约Solidity教程-事件和日志(一)
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​比特币大跌的 2 个原因
  • ​用户画像从0到100的构建思路
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (11)MSP430F5529 定时器B
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (solr系列:一)使用tomcat部署solr服务
  • (二)换源+apt-get基础配置+搜狗拼音
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (七)Knockout 创建自定义绑定
  • (转)scrum常见工具列表
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET处理HTTP请求
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [CERC2017]Cumulative Code
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [dart学习]第四篇:函数
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意