一.说明:

​ 本例是一个简易的Java TCP多人聊天室,先启动服务器端,再启动客户端,客户端敲入用户名,然后可以开始聊天,敲入信息,每一个在线的用户都会收到相应信息。
演示如下图:

二.服务器端代码

  • ServerMain.java

    import java.io.*;public class ServerMain {public static void main(String[] args) {ChatServer server = new ChatServer();try {server.ServerStart();}catch (IOException e) {e.printStackTrace();}}}
    
  • ChatServer.java

    import java.io.*;
    import java.net.*;
    import java.util.HashMap;public class ChatServer {// 设定端口号private final int port = 12345;public static HashMap<ClientThread,Socket> clientMap = new HashMap<>();public static int onlineNum = 0;public static void ServerSendToAll(ClientThread thread,String msg) throws IOException {for (ClientThread t : clientMap.keySet()) {if (t.clientName.equals(thread.clientName)) {Message.printMessage(msg);continue;}t.objOutput.writeObject(new DataPacket(Message.CMD.SENDALL, msg));}}public static void ServerSendToAll(ClientThread thread) throws IOException {onlineNum++;// 服务端记录Message.printMessage(thread.clientName + "上线了,当前在线人数" + onlineNum + "人");// 群发for (ClientThread t : clientMap.keySet()) {if (t.login == true) {t.objOutput.writeObject(new DataPacket(Message.CMD.LOGIN, "当前在线人数" + onlineNum + "人"));}   }}public void ServerStart() throws IOException {ServerSocket serverSocket = new ServerSocket(port);Message.printMessage("Server Start.");// 死循环等待客户端连接while (true) {// 每来一个客户端连接,保存Socket对象Socket clientSocket = serverSocket.accept();ClientThread client = new ClientThread(clientSocket);// 每连接一个客户端,创建一个对应的线程类Thread clientThread = new Thread(client);// 添加对象-Socket映射clientMap.put(client, clientSocket);// 启动线程clientThread.start();}}}
    
  • ClientThread.java

    import java.io.*;
    import java.net.*;/*线程类:处理每一个登录成功的客户端
    */
    public class ClientThread implements Runnable {// 保存每个客户端Socketprivate Socket client = null;public ObjectInputStream objInput = null;public ObjectOutputStream objOutput = null;public String clientName = null;public boolean login = false;public ClientThread(Socket client) {this.client = client;try {this.objInput = new ObjectInputStream(this.client.getInputStream());this.objOutput = new ObjectOutputStream(this.client.getOutputStream());} catch (IOException e) {Message.printLog(Message.logType.ERROR, "ClientThread:IOException!", true);e.printStackTrace();}}public int HandleReceiveMsg(Object data) throws IOException {DataPacket dataPacket = (DataPacket) data;switch (dataPacket.cmd) {case LOGIN:clientName = dataPacket.msg;login = true;ChatServer.ServerSendToAll(this);break;case SEND:// 收到消息,调用群发其他用户String msg = this.clientName + "说:" + dataPacket.msg;ChatServer.ServerSendToAll(this, msg);break;case SENDALL:// 收到其他用户群发的消息SendMessage(dataPacket);break;}return 0;}public void SendMessage(DataPacket data) throws IOException {this.objOutput.writeObject(data);}public Object ReceiveMessage() throws ClassNotFoundException, IOException {try {Object obj = this.objInput.readObject();return obj;} catch (EOFException e) {}return null;}@Overridepublic void run() {try {Object data;while ((data = ReceiveMessage()) != null) {HandleReceiveMsg(data);}} catch (SocketException e) {login = false;} catch (IOException e) {Message.printLog(Message.logType.ERROR, "ClientThread-run:IOException!", true);e.printStackTrace();} catch (ClassNotFoundException e) {Message.printLog(Message.logType.ERROR, "ClientThread-run:ClassNotFoundException!", true);e.printStackTrace();} finally {// 用户断开连接if (login == false) {// 从HashMap 移走映射ChatServer.clientMap.remove(this);// 释放资源if (client != null) {try {client.close();} catch (IOException e) {e.printStackTrace();}}ChatServer.onlineNum--;// 打印信息String msg = this.clientName + "下线了,当前在线" + ChatServer.onlineNum + "人";Message.printMessage(msg);try {ChatServer.ServerSendToAll(this, msg);} catch (IOException e) {e.printStackTrace();}}}}}
    

三.客户端代码

  • ClientMain.java

    public class ClientMain {public static void main(String[] args) {ChatClient client = new ChatClient();client.ClientStart();}
    }
    
  • ChatClient.java

    import java.io.*;
    import java.net.*;
    import java.util.Scanner;public class ChatClient {private static final int port = 12345;private static String serverAddress = "localhost";private Socket client = null;private ObjectOutputStream objOutput = null;private ObjectInputStream objInput = null;public void SendMessage(DataPacket data) throws IOException {// 发送数据给服务器objOutput.writeObject(data);}public void ClientStart() {Scanner in = new Scanner(System.in);String userInput = null;// 用户输入用户名登录Message.printLog(Message.logType.INFO, "请输入你的用户名:", false);userInput = in.nextLine();// 连接服务器try {this.client = new Socket(serverAddress, port);// 服务器已连接if (this.client.isConnected()) {// 获取输出流this.objOutput = new ObjectOutputStream(this.client.getOutputStream());// 获取输入流this.objInput = new ObjectInputStream(this.client.getInputStream());SendMessage(new DataPacket(Message.CMD.LOGIN, userInput));// 创建一个线程用于接收信息ClientReceiveMessageThread receiveMessage = new ClientReceiveMessageThread(this.objInput, userInput);Thread receiveThread = new Thread(receiveMessage);receiveThread.start();// 这个线程用于发送信息while (true) {userInput = in.nextLine();if (userInput != null) {SendMessage(new DataPacket(Message.CMD.SEND, userInput));} }}} catch (ConnectException e) {Message.printLog(Message.logType.ERROR, "ChatClient-ClientStart:ConnectException!", true);e.printStackTrace();} catch (SocketException e) {Message.printLog(Message.logType.ERROR, "服务器异常!", true);System.exit(0);} catch (IOException e) {Message.printLog(Message.logType.ERROR, "ChatClient-ClientStart:IOException!", true);e.printStackTrace();}}
    }class ClientReceiveMessageThread implements Runnable {private ObjectInputStream in = null;private String clientName = null;public ClientReceiveMessageThread(ObjectInputStream in, String name) {this.in = in;this.clientName = name;}public int HandleReceiveMsg(Object data) throws IOException {DataPacket dataPacket = (DataPacket) data;switch (dataPacket.cmd) {case LOGIN:case SEND:case SENDALL:Message.printMessage(dataPacket.msg);break;}return 0;}@Overridepublic void run() {Object data;try {while ((data = in.readObject()) != null) {HandleReceiveMsg(data);}} catch (EOFException e) {} catch (SocketException e) {Message.printLog(Message.logType.ERROR, "服务器异常!", true);System.exit(0);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}
    }
    

四.共用的类

  • Message.java

    import java.text.SimpleDateFormat;
    import java.util.Date;public class Message {// 是否打开debug输出private static boolean debug = false;// 设定日期时间格式public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd hh:mm:ss");public static enum logType {ERROR,INFO,WARN,DEBUG,};public static enum CMD {LOGIN,SEND,SENDALL,}public static void printLog(logType type, String msg, boolean newLine) {if( debug == true || type != logType.DEBUG ) {StringBuilder sb = new StringBuilder(128);sb.append("[").append(type).append("]").append(msg);if (newLine)System.out.println(sb);else System.out.print(sb);}}public static void printMessage(String msg) {StringBuilder sb = new StringBuilder(1024);sb.append("[").append(dateFormat.format(new Date())).append("]").append(msg);System.out.println(sb);     }
    }
    
  • DataPacket.java

    import java.io.Serializable;public class DataPacket implements Serializable {/***  自动生成的UID*/private static final long serialVersionUID = -5366828169862565011L;public Message.CMD cmd;public String msg;public DataPacket(Message.CMD cmd, String msg) {this.cmd = cmd;this.msg = msg;}
    }
    

Java TCP简易多人聊天室相关推荐

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

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

  2. JAVA网络编程NIO实现简易多人聊天室

    BIO模型 BIO即blocking IO,顾名思义是一种阻塞模型.当没有客户端连接时,服务端会一直阻塞,当有客户端新建连接时,服务端会新开一个线程去响应(不用多线程的话服务端同一时刻最多只能接收一个 ...

  3. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  4. 网络编程套接字(上篇)UDP实现简易多人聊天室

    目录 背景知识 主机间通信本质 socket 端口号特点: 为什么不用进程pid? 网络字节序 socket编程接口API sockaddr结构 ​编辑 简单UDP网络程序 了解UDP协议 简易多人聊 ...

  5. java socket多人聊天室_如何运用Java socket实现多人聊天室功能

    如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...

  6. java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统

    基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  7. java socket多人聊天_如何运用Java socket实现多人聊天室功能

    导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...

  8. TCP创建多人聊天室

    群聊-聊天室 群聊:任何时候,任何一个客户端都可以向其它客户端发送和接受数据,服务器只起到转发的作用. 1.首先创建一个聊天室的简易版(版本1). 需求:可以多个用户同时访问服务端,并且可以不断各自请 ...

  9. linux多人聊天室 qt,Qt编程详解--网络通信之基于TCP的多人聊天室

    一.了解TCP的通信过程 Qt中封装了TCP协议 QTcpServer类负责服务端: 1.创建QTcpServer对象 2.监听listen需要的参数是地址和端口号 3.当有新的客户端连接成功时会发射 ...

最新文章

  1. keras 的 example 文件 conv_lstm.py 解析
  2. 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
  3. 高校在线考试系统_高校在线考试系统有哪些优点
  4. 别人给你网盘分享东西怎么搞到电脑上看呢?
  5. 小技巧:让linux程序在后台运行
  6. 使用vim打开文件的16进制形式,编辑和全文替换
  7. 核心技术java基础_JAVA核心技术I---JAVA基础知识(集合set)
  8. 计算机网络第4版潘爱民_王道考研 计算机网络(2)学习笔记
  9. C++虚函数及虚函数表解析
  10. 数学归纳法证明时间复杂度
  11. 如何提升深度学习的性能
  12. 创业维艰--书摘+乱七八糟
  13. pinpoint全链路监控安装部署(支持dubbo)
  14. 记录mumu模拟器AMD SVM(VT)开启失败的问题
  15. 微型计算机3月2017,2017年3月计算机一级《MS Office》巩固试题及答案
  16. 极大似然估计——简述
  17. Java汉语转拼音首字母并大写利用Pinyin4j(多音字识别)(中午括号识别)
  18. mysql之表与表之间的关系
  19. 软件需求分析课堂讨论01
  20. 乐谱播放器 android,光遇乐谱 免费版

热门文章

  1. 筋膜枪功能方案+PCBA
  2. RN:CodePush热更新
  3. java在gradle工程访问src/test/resources目录下的资源配置文件
  4. iPhone高清晰电影视频转换快速教程
  5. 【EHub_tx1_tx2_A200】Ubuntu18.04 + ROS_ Melodic + 锐驰LakiBeam 1L单线激光 雷达评测
  6. 从“幕后”走到“前台 ” 德力的C2M制造变革
  7. python语法简洁清晰特色之一是强制用什么作为语句缩进_python语言特色
  8. ChatGPT:“抢走你工作的不会是 AI ,而是先掌握 AI 能力的人”
  9. Python 判断日期为周几,是否工作日,法定假日
  10. 【闲聊杂谈】深入剖析Java8新特性