一.客户端的创建

1.我们可以用Socket来创建客户端

/***@类名 Client*@描述 TODO 客户端 1*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:18**/
public class Client {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("-----Client1-----");BufferedReader br =new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入用户名:");String name =br.readLine();//1、建立连接: 使用Socket创建客户端 +服务的地址和端口Socket client =new Socket("localhost",8888);//2、客户端发送消息new Thread(new Send(client,name)).start();  new Thread(new Receive(client)).start();}
}

2.这时我们需要接受其他客户端发送的数据,我们需要创建一个客户端的接收方法和发送方法,我可以用阻塞式的方式进行接收和发送,考虑到多线程的安全性,可以实现Runnable
1.Send发送端:

/***@类名 Send*@描述 TODO 使用多线程封装:发送端*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:23**/
public class Send implements Runnable {private BufferedReader console ;private DataOutputStream dos;private Socket client;private boolean isRunning;private String name;public Send(Socket client,String name) {this.client =client;console =new BufferedReader(new InputStreamReader(System.in));this.isRunning = true;this.name = name;try {dos =new DataOutputStream(client.getOutputStream());//发送名称send(name);} catch (IOException e) {System.out.println("==1==");this.release();} }@Overridepublic void run() {while(isRunning) {String msg = getStrFromConsole();if(!msg.equals("")) {send(msg);}}}  //发送消息private void send(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println(e);System.out.println("===3==");release();}}/*** 从控制台获取消息* @return*/private String getStrFromConsole() {try {return  console.readLine();} catch (IOException e) {e.printStackTrace();}return "";}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dos,client);}}

2.接收端

/***@类名 Receive*@描述 TODO 使用多线程封装:接收端*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:22**/
public class Receive implements Runnable {private DataInputStream dis ;private Socket client;private boolean isRunning;public Receive(Socket client) {this.client = client;this.isRunning = true;try {dis =new DataInputStream(client.getInputStream());} catch (IOException e) {System.out.println("====离开一位=====");release();}}//接收消息private String receive() {String msg ="";try {msg =dis.readUTF();} catch (IOException e) {System.out.println("====接收消息异常====");release();}return msg;}@Overridepublic void run() {      while(isRunning) {String msg =receive();if(!msg.equals("")) {System.out.println(msg);}}}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dis,client);}}

3.统一释放资源的方法可以提出,服务的也用得上

/***@类名 CloseUtils*@描述 TODO 工具类,统一释放资源*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:20**/
public class CloseUtils {/*** 释放资源*/public static void close(Closeable... targets ) {for(Closeable target:targets) {try {if(null!=target) {target.close();}}catch(Exception e) {}}}
}

二客户端的创建

服务端用ServerSocket创建,如果我们吧服务的和客户端看成事一个通信通道(Channel),那么每个客户端的接入都会创建一个通信通道,那么通信通道的创建也需要实现多线程,可以实现Runnable接口,我们存放通道可以用线程容器CopyOnWriteArrayList来存放通道。

/***@类名 Chat*@描述 TODO Socket服务端(测试类)*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:17**/
public class Chat {private static CopyOnWriteArrayList<Channel> all =new CopyOnWriteArrayList<Channel>();public static void main(String[] args) throws IOException {System.out.println("-----Server-----");// 1、指定端口 使用ServerSocket创建服务器ServerSocket server =new ServerSocket(8888);// 2、阻塞式等待连接 acceptwhile(true) {Socket  client =server.accept(); System.out.println("一个客户端建立了连接");Channel c =new Channel(client);all.add(c); //管理所有的成员new Thread(c).start();            }       }//一个客户代表一个Channelstatic class Channel implements Runnable{private DataInputStream dis;private DataOutputStream dos;private Socket  client;         private boolean isRunning;private String name;public Channel(Socket  client) {this.client = client;try {dis = new DataInputStream(client.getInputStream());dos =new DataOutputStream(client.getOutputStream());isRunning =true;//获取名称this.name =receive();//退出出聊天室//欢迎你的到来this.send("欢迎你的到来");sendOthers(this.name+"来了徐康聊天室",true);//暂时固定为私聊} catch (IOException e) {System.out.println("---1------");release();                    }           }//接收消息private String receive() {String msg ="";try {msg =dis.readUTF();} catch (IOException e) {System.out.println("---2------");release();}return msg;}//发送消息private void send(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println("---3------");release();}}/*** @方法名 sendOthers* @描述 TODO 群聊:获取自己的消息,发给其他人,需要设置isSys为false*       TODO 私聊: 约定数据格式: @xxx:msg* @参数 msg 发送内容* @返回值* @创建人 XuKang* @创建时间 2020/9/24 16:28*/private void sendOthers(String msg,boolean isSys) {boolean isPrivate = msg.startsWith("@");if(isPrivate) { //私聊int idx =msg.indexOf(":");//获取目标和数据String targetName = msg.substring(1,idx);msg = msg.substring(idx+1);for(Channel other: all) {if(other.name.equals(targetName)) {//目标other.send(this.name +"悄悄地对您说:"+msg);break;}}}else {               for(Channel other: all) {if(other==this) { //自己continue;}if(!isSys) {other.send(this.name +"对所有人说:"+msg);//群聊消息}else {other.send(msg); //系统消息}}}}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dis,dos,client);//退出all.remove(this);sendOthers(this.name+"离开大家庭...",true);}@Overridepublic void run() {while(isRunning) {String msg = receive() ;if(!msg.equals("")) {//send(msg);sendOthers(msg,false);}}}}
}

三、效果如下

1.启动服务端

2.启动客户端





3.发送消息




总结

此案例只能用来打发时间,入门网络编程可以参考一下,真正的开发不会这么弄

用Java代码实现一个简单的聊天室功能相关推荐

  1. 前端+node实现一个简单的聊天室功能

    简单的实现一个聊天室功能 目录 前言 一.了解一下WebSocket 我们有了http协议,为什么会出现ws呢? ws出现之前,我们是怎么实现双向通信的呢? 二.使用到的websocket库 三.聊天 ...

  2. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

  3. Netty - 一个简单的聊天室小项目

     经过一段时间对Netty的学习,我们对Netty各版本以及像ProtocolBuffers等技术应用都有了不少相关的了解, 我们就用这段时间学到的只是做一个简单的聊天室的小项目来练习自己学到的技术. ...

  4. python开发一个简单的聊天室

    使用python的twisted框架编写一个简单的聊天室 下面是基本架构 基本架构图 -- coding:utf-8 -- from twisted.internet.protocol import ...

  5. python聊天室详细教程_python简单实现聊天室功能(代码教程)

    聊天室程序需求: 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 这里我们首先要 ...

  6. 使用Unity制作一个简单的聊天室

    使用控制台作为一个服务器,在Unity中开发客户端,制作一个简易的聊天室,无论哪个客户端发送消息,其他的客户端都会实时的显示出来. 服务器代码 using System; using System.C ...

  7. JAVA——如何写一个简单的聊天框

    这是上学期JAVA选修课课下的一道简单的线上家庭作业题,题目描述如下: 总的来说就是要按照它的描述写一个聊天室界面.由于是选修课要求不高,老师只要求我们写出大致界面即可不用实现具体功能,不过闲来无事我 ...

  8. 表达式计算器 java代码_Java实现简单的表达式计算器功能示例

    本文实例讲述了Java实现简单的表达式计算器功能.分享给大家供大家参考,具体如下: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例 ...

  9. Go 实现一个简单的聊天室

    创建客户端 先在main方法中创建一个sorcket服务端,这个服务端就像一个酒店 func main() {listen, err := net.Listen("tcp", &q ...

  10. 使用netty搭建一个简单的聊天室

    1.导入maven依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all< ...

最新文章

  1. 国家电网公司“SG186”工程总部企业门户开发实施
  2. react-native-webview禁止缩放
  3. 「服务端」node服务的监控预警系统架构
  4. C语言——反弹球游戏(第二阶段
  5. l2-008 最长对称子串 (25分)_小学数学关于时间认识(时、分、秒)的几点总结
  6. ppt中如何合并流程图_PPT中图片如何排版才能好看
  7. 主板定制X86嵌入式器件选型
  8. python什么叫索引_python字典的索引是什么
  9. matlab plotyy 属性如何调整,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...
  10. chrome浏览器添加crx插件
  11. Redis的Java客户端——Jedis
  12. 再论关于如何学习网络编程
  13. 自然数因式分解最小和
  14. 【Linux设置系统时间】
  15. 基于VBA实现Excel十字交叉高亮显示
  16. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备
  17. elastic-job:参考elastic-console在自己代码中实现任务的失效、生效、终止操作
  18. 刷脸支付逐渐普及刷脸项目也逐渐火热起来
  19. wot的游戏引擎很牛吧_使用WOT享受更安全的Web浏览
  20. python计算器程序_利用Python代码编写计算器小程序

热门文章

  1. 度数换算_度数换算计算器
  2. SCT2450QSTE 国产车规AEC-Q100 3.8V-36V 5A 高效同步降压 DCDC 转换器 替代TSP54540
  3. 施耐德PLC Unity Pro xl 软件使用三
  4. 虚拟主机与云服务器的区别
  5. 精细化管理设备资产,降低企业运营成本
  6. Simulink模型的仿真
  7. 从音箱入门到高手必看知识(一)—— 音箱初级知识
  8. 面对面的办公室——纪念艾伦•图灵百年诞辰
  9. 测试打印机性能的软件,打印速度测试
  10. Mate30安装谷歌全家桶(20200215,成功)