第五课: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){}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/497775.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一,其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标,直接影响着黄金交易的买卖。那么国际黄金价格到底是什么,与黄金价格又有何区别呢?本文将为您详细解答。 国际黄金价格是指以美元计量的…

如何恢复数据?5个实用数据恢复方法!

亲爱的朋友们,你是否也有过这样的经历,电脑里的数据突然消失,让你手足无措?别担心,今天我就来教你如何恢复数据,让你不再为数据丢失而烦恼。 首先,我们需要了解数据丢失的原因。可能是你不小心…

ZDH-大数据采集-支持KETTLE任务

目录 目录 项目源码 预览地址 支持KETTLE介绍 新增KETTLE任务 配置调度KETTLE 重要说明 感谢支持 项目源码 预览地址 支持KETTLE介绍 新增KETTLE任务 配置调度KETTLE 重要说明 项目源码 zdh_web:GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

【MySQL】基于Docker搭建MySQL一主二从集群

本文记录了搭建mysql一主二从集群,这样的一个集群master为可读写,slave为只读。过程中使用了docker,便于快速搭建单体mysql。 1,准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…

快速搭建网站原型!8款网站原型软件推荐

现在,基于云的软件已经逐渐成为主流,网站原型设计工具也不例外。与桌面版本相比,在线原型工具具有独特的优势,无论您使用Linux,Mac 或者Windows,都不需要安装就可以使用这些工具。下面小编就为大家推荐8款非…

nginx(三)实现反向代理客户端 IP透传

正常情况下,客户端去访问代理服务器,然后代理服务器再取访问真实服务器,在真实服务器上,只能显示代理服务器的ip地址,而不显示客户端的ip地址,如果想让客户端的ip地址也能在真实服务端看见,这一…

Python怎么操作Mysql数据库

目录 一、准备工作 二、连接数据库 三、执行SQL语句 四、处理查询结果 五、插入、更新和删除数据 插入数据: 更新数据: 删除数据: 六、错误处理 七、总结 随着数据驱动决策的理念逐渐深入人心,数据库操作已成为现代编程…

Java设计模式:组合模式

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

使用pyannote-audio实现声纹分割聚类

使用pyannote-audio实现声纹分割聚类 # GitHub地址 https://github.com/MasonYyp/audio1 简单介绍 pyannote.audio是用Python编写的用于声纹分割聚类的开源工具包。在PyTorch机器学习基础上,不仅可以借助性能优越的预训练模型和管道实现声纹分割聚类,还…

【React 报错】—Remove untracked files, stash or commit any changes, and try again.

【React 报错】—Remove untracked files, stash or commit any changes, and try again. 在react项目中通过.less文件进行样式定义,先暴露webpack配置文件,执行命令:yarn eject 或 npm run eject,报错如下: 原因是因…

掌握关键生活细节,让小脑萎缩患者的生活更美好

在这个充满变数的世界里,小脑萎缩患者的生活似乎更加充满挑战。但只要用心,生活的每一个角落都能绽放出不一样的光彩。今天,就让我们一起走进小脑萎缩患者的日常,探索他们需要注意的事项,共同守护这份温暖而坚韧的生活…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读: 大概意思就是用()把每个节点的值给括起来,然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现,其实这个题目可以大致分为三种情况&#xff1…