Java TCP简易多人聊天室
一.说明:
本例是一个简易的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简易多人聊天室相关推荐
- Java Socket实现简易多人聊天室传输聊天内容或文件
Java Socket实现简易多人聊天室传输聊天内容或文件 Java小练手项目:用Java Socket实现多人聊天室,聊天室功能包括传输聊天内容或者文件.相比于其它的聊天室,增加了传输文件的功能供参 ...
- JAVA网络编程NIO实现简易多人聊天室
BIO模型 BIO即blocking IO,顾名思义是一种阻塞模型.当没有客户端连接时,服务端会一直阻塞,当有客户端新建连接时,服务端会新开一个线程去响应(不用多线程的话服务端同一时刻最多只能接收一个 ...
- python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...
前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...
- 网络编程套接字(上篇)UDP实现简易多人聊天室
目录 背景知识 主机间通信本质 socket 端口号特点: 为什么不用进程pid? 网络字节序 socket编程接口API sockaddr结构 编辑 简单UDP网络程序 了解UDP协议 简易多人聊 ...
- java socket多人聊天室_如何运用Java socket实现多人聊天室功能
如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...
- java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统
基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...
- java socket多人聊天_如何运用Java socket实现多人聊天室功能
导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...
- TCP创建多人聊天室
群聊-聊天室 群聊:任何时候,任何一个客户端都可以向其它客户端发送和接受数据,服务器只起到转发的作用. 1.首先创建一个聊天室的简易版(版本1). 需求:可以多个用户同时访问服务端,并且可以不断各自请 ...
- linux多人聊天室 qt,Qt编程详解--网络通信之基于TCP的多人聊天室
一.了解TCP的通信过程 Qt中封装了TCP协议 QTcpServer类负责服务端: 1.创建QTcpServer对象 2.监听listen需要的参数是地址和端口号 3.当有新的客户端连接成功时会发射 ...
最新文章
- keras 的 example 文件 conv_lstm.py 解析
- 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
- 高校在线考试系统_高校在线考试系统有哪些优点
- 别人给你网盘分享东西怎么搞到电脑上看呢?
- 小技巧:让linux程序在后台运行
- 使用vim打开文件的16进制形式,编辑和全文替换
- 核心技术java基础_JAVA核心技术I---JAVA基础知识(集合set)
- 计算机网络第4版潘爱民_王道考研 计算机网络(2)学习笔记
- C++虚函数及虚函数表解析
- 数学归纳法证明时间复杂度
- 如何提升深度学习的性能
- 创业维艰--书摘+乱七八糟
- pinpoint全链路监控安装部署(支持dubbo)
- 记录mumu模拟器AMD SVM(VT)开启失败的问题
- 微型计算机3月2017,2017年3月计算机一级《MS Office》巩固试题及答案
- 极大似然估计——简述
- Java汉语转拼音首字母并大写利用Pinyin4j(多音字识别)(中午括号识别)
- mysql之表与表之间的关系
- 软件需求分析课堂讨论01
- 乐谱播放器 android,光遇乐谱 免费版
热门文章
- 筋膜枪功能方案+PCBA
- RN:CodePush热更新
- java在gradle工程访问src/test/resources目录下的资源配置文件
- iPhone高清晰电影视频转换快速教程
- 【EHub_tx1_tx2_A200】Ubuntu18.04 + ROS_ Melodic + 锐驰LakiBeam 1L单线激光 雷达评测
- 从“幕后”走到“前台 ” 德力的C2M制造变革
- python语法简洁清晰特色之一是强制用什么作为语句缩进_python语言特色
- ChatGPT:“抢走你工作的不会是 AI ,而是先掌握 AI 能力的人”
- Python 判断日期为周几,是否工作日,法定假日
- 【闲聊杂谈】深入剖析Java8新特性