当前位置: 首页 > news >正文

第五课:BIO高级操作

一、BIO模式下的端口转发思想

需求:需要实现是个客户端的消息可以发送给所有的客户端接收.(群聊实现)
在这里插入图片描述
我们每一个客户端都会和服务器端建立一个socket通道,这样服务器端和客户端就能够实现通信。为了让服务器端知道我们当前有多少个socket正在运行,我们就建立一个socket集合。把当前连接的客户端socket存入到一个所谓的在线socket集合中保存,这样服务器端就知道那些客户端和服务器端正在进行通信。
当一个客户端A发送消息给服务器端的时候,当服务器端接收到消息以后,就可以变量socket集合,给每一个客户端将客户端A发送的消息发送过去,进而实现群聊。

服务器端

public class Client {public static void main(String[] args) throws Exception {Socket socket = new Socket("127.0.0.1", 8080);//开启数据发送线程new sendMessThread(socket).start();//开启数据接收线程new readerThread(socket).start();}
}// 发送数据到服务器
class sendMessThread extends Thread{private Socket socket;public sendMessThread(Socket socket){this.socket = socket;}@Overridepublic void run() {super.run();//写操作Scanner scanner=null;OutputStream os= null;try {scanner=new Scanner(System.in);os= socket.getOutputStream();String in="";while (true){String message = scanner.nextLine();os.write(message.getBytes());//4.关闭os.flush();}} catch (IOException e) {e.printStackTrace();}scanner.close();try {os.close();} catch (IOException e) {e.printStackTrace();}}
}
// 接收服务器的消息
class readerThread extends Thread{private Socket socket;public readerThread(Socket socket){this.socket = socket;}@Overridepublic void run(){try {//1、从socket中去获取当前客户端的输入流InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, len,"UTF-8"));}}catch (Exception e){}}
}

客户端

public class Client {public static void main(String[] args) throws Exception {Socket socket = new Socket("127.0.0.1", 8080);//开启数据发送线程new sendMessThread(socket).start();//开启数据接收线程new readerThread(socket).start();}
}// 发送数据到服务器
class sendMessThread extends Thread{private Socket socket;public sendMessThread(Socket socket){this.socket = socket;}@Overridepublic void run() {super.run();//写操作Scanner scanner=null;OutputStream os= null;try {scanner=new Scanner(System.in);os= socket.getOutputStream();String in="";while (true){String message = scanner.nextLine();os.write(message.getBytes());//4.关闭os.flush();}} catch (IOException e) {e.printStackTrace();}scanner.close();try {os.close();} catch (IOException e) {e.printStackTrace();}}
}
// 接收服务器的消息
class readerThread extends Thread{private Socket socket;public readerThread(Socket socket){this.socket = socket;}@Overridepublic void run(){try {//1、从socket中去获取当前客户端的输入流InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, len,"UTF-8"));}}catch (Exception e){}}
}

相关文章:

  • iMazing3安全吗?好不好用?值不值得下载
  • 自动化信息抽取:提升物资仓库管理效率的实践案例
  • Android 验证启动模式
  • 幻兽帕鲁专用服务器搭建之Linux部署配置教程
  • SpringBoot+Vue全栈开发-刘老师教编程(b站)(一)
  • [CSS]文字旁边的竖线以及布局知识
  • 设计模式:软件工程的艺术
  • BOOT电路
  • 【4.3计算机网络】网络规划与设计
  • QT C++实践|超详细数据库的连接和增删改查操作|附源码
  • 【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】
  • 【查漏补缺你的Vue基础】Vue数据监听深度解析
  • SQL函数学习记录
  • mac m3安装nvm安装说明;mac安装xbrew
  • 【机器人最短路径规划问题(栅格地图)】基于遗传算法求解
  • Google 是如何开发 Web 框架的
  • 【comparator, comparable】小总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • exif信息对照
  • HTTP 简介
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java中具有继承关系的类及其对象初始化顺序
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • nodejs实现webservice问题总结
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SQLServer之索引简介
  • Unix命令
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 聚簇索引和非聚簇索引
  • 漂亮刷新控件-iOS
  • 如何进阶一名有竞争力的程序员?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 王永庆:技术创新改变教育未来
  • 一道面试题引发的“血案”
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (09)Hive——CTE 公共表达式
  • (C++17) optional的使用
  • (八)Flask之app.route装饰器函数的参数
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (新)网络工程师考点串讲与真题详解
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net MySql
  • .net 托管代码与非托管代码
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET大文件上传知识整理
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)