预备小知识连接:
小小聊天室,慢慢的回忆啊!(TCP 通信实现)


先看效果



主要可以分为三个层:服务端层,客户端层,还有就是工具层;

  1. 服务断层:包括接收数据,以及转发数据(数据输出输入流);
  2. 客户端层:接收数据以及发送数据(利用键盘录入,转换流,缓冲流,数据输入输出流);
  3. 工具层:主要就是用于关闭流的工具类(简单,粗暴)

创建工具层

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实现聊天室群聊功能)相关推荐

  1. 基于Vue+springboot+websocket实现的简短仿微信web聊天室(私聊和群聊功能)(可在线预览)

    写目录 一.界面展示 二.介绍 一.界面展示 之前闲着有空就给自己的个人博客搭了一些附加功能,聊天室也是其中之一,简单的实现了私聊.群聊功能,可以发送emoji表情和图片等,项目已经部署在www.tc ...

  2. C++搭建集群聊天室(十四):群聊功能

    文章目录 群聊功能思路 放码过来 groupuser.hpp group.hpp groupmodel.hpp groupmodel.cpp 群聊功能思路 1.创建群聊,提交群信息,返回群号 2.拉取 ...

  3. 实现了私聊和群聊功能的聊天工具

    在前面的博客(简单的C/S聊天室)中,我们已经提到了,采用的是多线程的方法.服务器端主线程负责不断的侦听端口,子线程负责接收和发送消息.客户端主线程需要接收键盘消息,将其发送到服务器端,子线程需要接收 ...

  4. 用C++/MFC实现P2P和群聊功能的聊天小软件

    final edit 2015-01-03 · 实现平台: Window 8.1,Visual Studio 2013 Window 7, Visual Studio 2010 · 所用框架: 是基于 ...

  5. Java网络编程,模拟QQ群聊功能

    Java网络编程,模拟QQ群聊功能 一.网络编程知识点简介: 1.C/S架构:Client客户端/Server服务器: 涉及到的应用:桌面的应用软件,QQ,王者荣耀 涉及到的技术:Socket网络编程 ...

  6. java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格

    java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...

  7. 基于Java实现企业微信群聊机器人-文件上传+消息推送(保证可用)

    基于Java实现企业微信群聊机器人-文件上传+消息推送 1.pom.xml(注意版本尽量保持一致) 2.文件工具类 3.企业微信请求类 4.企业微信响应类 5.发送方法 6.企业微信机器人创建和配置 ...

  8. Java使用TCP实现群聊 聊天室(多线程和tcp的使用)

    一:引言: 显示结果在控制台显示,未能实现图形界面的结合 二:上码 1.服务端 package com.wyj.talkhome; /** * 实现一个用户可以接发多条消息 * * */ import ...

  9. Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)

    场景 Netty的Socket编程详解-搭建服务端与客户端并进行数据传输: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086 ...

  10. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能...

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

最新文章

  1. java时间转换 YYYY yyyy
  2. ISE中使用Notepad++的关联设置以及Notepad++的护眼设置(设置背景色)
  3. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
  4. django项目实战(2)-数据库配置
  5. 简单易懂的自动驾驶科普知识
  6. java与c应用,Java和C应用程序之间的IPC
  7. 四十一、Linux基础命令,用户管理和文件系统总结
  8. python怎么变成竖行_python 处理文本 列变成行
  9. C++ vector容器类型 (摘自漫步云端的博客)
  10. FreeRTOS系统配置文件FreeRTOSConfig.h
  11. c++ 之类的前置声明
  12. 为什么C语言仍然占据统治地位?
  13. spring实战三装配bean之Bean的作用域以及初始化和销毁Bean
  14. FLUKE 754过程校准器带HART协议
  15. PcShare2005代码阅读(1)
  16. hdu2122 Ice_cream’s world III(MST)
  17. 图灵工业机器人说明书_从2020世界人工智能大会,看工业机器人领域领军企业布局|机器人大讲堂...
  18. 调用阿里云的通用文字识别-高精版识别接口,识别图片中的文字详解
  19. java-老鼠出迷宫
  20. 阿里二面一问MySQL就开始野了,抓着底层原理不撒手啊!

热门文章

  1. web模拟telnet
  2. Vim快捷输出查找寄存器的内容(去除\,\和\V)
  3. 在Javascript中 声明时用var与不用var的区别,== 和 ===的区别
  4. Sublime Text 2报“Decode error - output not utf-8”错误的解决办法
  5. Merge Sorted Array
  6. Java设计模式(16)中介模式(Mediator模式)
  7. hdu 4614 Vases and Flowers
  8. C++ Primer 5th笔记(chap 12 动态内存)动态数组
  9. C++(九)——职工信息管理系统
  10. HDU-2149(博弈)