当年的聊天室,今天的我(java实现聊天室群聊功能)
预备小知识连接:
小小聊天室,慢慢的回忆啊!(TCP 通信实现)
先看效果
主要可以分为三个层:服务端层,客户端层,还有就是工具层;
- 服务断层:包括接收数据,以及转发数据(数据输出输入流);
- 客户端层:接收数据以及发送数据(利用键盘录入,转换流,缓冲流,数据输入输出流);
- 工具层:主要就是用于关闭流的工具类(简单,粗暴)
创建工具层
import java.io.Closeable;
import java.io.IOException;/*** 用于关闭的工具类* */
public class CloseUtil {public static void closeAll(Closeable... closeable) {for(Closeable c:closeable) {if(c!=null) {try {c.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
服务层
服务层线程类
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;import com.bjsxt.util.CloseUtil;
/*** 将获取每一个客户端都要执行的代码,封装到该类中,并实现Runnable接口,完成多线程* */public class ServerThread implements Runnable{private DataInputStream dis;private DataOutputStream dos;private boolean flag = true;//判断是否有异常public ServerThread(Socket client) {try {dis = new DataInputStream(client.getInputStream());dos = new DataOutputStream(client.getOutputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dos,dis);ServerMain.list.remove(this);}}// 接收信息的方法public String getMessage() {String str = "" ;try {str = dis.readUTF();} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);ServerMain.list.remove(this);}return str;}
// 做出响应的方法public void send(String str) {if(str!=null&&str.length()>0) {try {dos.writeUTF(str);} catch (IOException e) {flag = false;CloseUtil.closeAll(dos);}}}// 转发消息的方法public void sendOther(String str) {List<ServerThread> list = ServerMain.list;for(ServerThread serverThread : list) {if(serverThread==this) {continue;}serverThread.send(str);}}@Overridepublic void run() {while(flag) {this.sendOther(Thread.currentThread().getName()+":"+"\t"+getMessage());}}}
创建服务器启动类
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class ServerMain {public static List<ServerThread> list = new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("-------------服务器已启动-------------------");
// 获取ServerSocket对象ServerSocket serverSocket = new ServerSocket(10002);while(true) {// 监听客户端Socket client = serverSocket.accept();ServerThread st = new ServerThread(client);list.add(st);new Thread(st).start();}}}
客户端层
创建发送信息的线程类
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import com.bjsxt.util.CloseUtil;/*** 发送信息的线程* */
public class Sending implements Runnable{private BufferedReader br;private DataOutputStream dos;private boolean flag = true; //判断是否有异常public Sending() {br = new BufferedReader(new InputStreamReader(System.in));}public Sending(Socket socket) {this();try {dos = new DataOutputStream(socket.getOutputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dos,socket);}}// 接收键盘录入信息方法private String getMessage() {String str = "";try {str = br.readLine();} catch (IOException e) {flag = false; CloseUtil.closeAll(br);}return str;}// 发送信息的方法private void sendf(String str) {try {dos.writeUTF(str);} catch (IOException e) {flag = false;CloseUtil.closeAll(dos);}}// 循环调用发送信息的方法@Overridepublic void run() {while(flag) {this.sendf(getMessage());}}}
创建接收信息的线程类
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;import com.bjsxt.util.CloseUtil;public class Receiving implements Runnable{private DataInputStream dis;private boolean flag = true;public Receiving(Socket socket) {try {dis = new DataInputStream(socket.getInputStream());} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);}}// 接收消息的方法public String getMessage() {String str = "";try {str = dis.readUTF();} catch (IOException e) {flag = false;CloseUtil.closeAll(dis);}return str;}// 循环调用获取消息的方法@Overridepublic void run() {while(flag) {System.out.println(this.getMessage());}}}
创建客户端启动类
package com.bjsxt.client;import java.io.IOException;
import java.net.Socket;/*** 客户端* */
public class ClientMain {public static void main(String[] args) throws IOException {// 获取Socket对象 并给定地址与端口号Socket socket = new Socket("127.0.0.1",10002);// 获取接收信息与发送信息的线程对象Sending sending = new Sending(socket);Receiving receiving = new Receiving(socket);new Thread(sending).start();new Thread(receiving).start();}
}
感觉收看,如果帮到您,点个赞,关个注,评个论呗,葵花在这里感觉不尽!!!
当年的聊天室,今天的我(java实现聊天室群聊功能)相关推荐
- 基于Vue+springboot+websocket实现的简短仿微信web聊天室(私聊和群聊功能)(可在线预览)
写目录 一.界面展示 二.介绍 一.界面展示 之前闲着有空就给自己的个人博客搭了一些附加功能,聊天室也是其中之一,简单的实现了私聊.群聊功能,可以发送emoji表情和图片等,项目已经部署在www.tc ...
- C++搭建集群聊天室(十四):群聊功能
文章目录 群聊功能思路 放码过来 groupuser.hpp group.hpp groupmodel.hpp groupmodel.cpp 群聊功能思路 1.创建群聊,提交群信息,返回群号 2.拉取 ...
- 实现了私聊和群聊功能的聊天工具
在前面的博客(简单的C/S聊天室)中,我们已经提到了,采用的是多线程的方法.服务器端主线程负责不断的侦听端口,子线程负责接收和发送消息.客户端主线程需要接收键盘消息,将其发送到服务器端,子线程需要接收 ...
- 用C++/MFC实现P2P和群聊功能的聊天小软件
final edit 2015-01-03 · 实现平台: Window 8.1,Visual Studio 2013 Window 7, Visual Studio 2010 · 所用框架: 是基于 ...
- Java网络编程,模拟QQ群聊功能
Java网络编程,模拟QQ群聊功能 一.网络编程知识点简介: 1.C/S架构:Client客户端/Server服务器: 涉及到的应用:桌面的应用软件,QQ,王者荣耀 涉及到的技术:Socket网络编程 ...
- java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格
java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...
- 基于Java实现企业微信群聊机器人-文件上传+消息推送(保证可用)
基于Java实现企业微信群聊机器人-文件上传+消息推送 1.pom.xml(注意版本尽量保持一致) 2.文件工具类 3.企业微信请求类 4.企业微信响应类 5.发送方法 6.企业微信机器人创建和配置 ...
- Java使用TCP实现群聊 聊天室(多线程和tcp的使用)
一:引言: 显示结果在控制台显示,未能实现图形界面的结合 二:上码 1.服务端 package com.wyj.talkhome; /** * 实现一个用户可以接发多条消息 * * */ import ...
- Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
场景 Netty的Socket编程详解-搭建服务端与客户端并进行数据传输: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086 ...
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能...
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
最新文章
- java时间转换 YYYY yyyy
- ISE中使用Notepad++的关联设置以及Notepad++的护眼设置(设置背景色)
- envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
- django项目实战(2)-数据库配置
- 简单易懂的自动驾驶科普知识
- java与c应用,Java和C应用程序之间的IPC
- 四十一、Linux基础命令,用户管理和文件系统总结
- python怎么变成竖行_python 处理文本 列变成行
- C++ vector容器类型 (摘自漫步云端的博客)
- FreeRTOS系统配置文件FreeRTOSConfig.h
- c++ 之类的前置声明
- 为什么C语言仍然占据统治地位?
- spring实战三装配bean之Bean的作用域以及初始化和销毁Bean
- FLUKE 754过程校准器带HART协议
- PcShare2005代码阅读(1)
- hdu2122 Ice_cream’s world III(MST)
- 图灵工业机器人说明书_从2020世界人工智能大会,看工业机器人领域领军企业布局|机器人大讲堂...
- 调用阿里云的通用文字识别-高精版识别接口,识别图片中的文字详解
- java-老鼠出迷宫
- 阿里二面一问MySQL就开始野了,抓着底层原理不撒手啊!
热门文章
- web模拟telnet
- Vim快捷输出查找寄存器的内容(去除\,\和\V)
- 在Javascript中 声明时用var与不用var的区别,== 和 ===的区别
- Sublime Text 2报“Decode error - output not utf-8”错误的解决办法
- Merge Sorted Array
- Java设计模式(16)中介模式(Mediator模式)
- hdu 4614 Vases and Flowers
- C++ Primer 5th笔记(chap 12 动态内存)动态数组
- C++(九)——职工信息管理系统
- HDU-2149(博弈)