热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于JavaI/O模型的个人理解(二)代码

1.BIO客户端简单编写publicstaticvoidmain(String[]args){try{1.创建socket对象SocketsocketnewSocket(12

1.BIO 

客户端简单编写

public static void main(String[] args) {try {//1.创建socket对象Socket socket=new Socket("127.0.0.1", 9999);//2.从socket 获取字节输入流OutputStream out=socket.getOutputStream();//字节输入流换成打印流PrintStream ps=new PrintStream(out,true);Scanner san=new Scanner(System.in);while (true){System.out.print("请说:");ps.println(san.nextLine()) ;}} catch (IOException e) {e.printStackTrace();}}

服务端简单编写

public static void main(String[] args) {try {System.out.println("开始注册端口");//注册端口ServerSocket serversocket=new ServerSocket(9999);//循环获取socket 监听while(true){Socket so=serversocket.accept();new ServerThread(so).start();}} catch (Exception e) {e.printStackTrace();}
}

定义一个ServerThread线程类

public class ServerThread extends Thread{private Socket socket;public ServerThread(Socket so) {this.socket=so;}@Overridepublic void run() {try {InputStream input=socket.getInputStream();BufferedReader read=new BufferedReader(new InputStreamReader(input));String msg;while( (msg=read.readLine())!=null ){System.out.println(msg);}} catch (Exception e) {e.printStackTrace();}}
}

2. NIO 代码开发,同样也是实现客户端和服务端交互

客户端:

public class Client {//1.选择器private Selector selector;//2.客户端通道private SocketChannel socketChannel;//3.端口private static int PORT = 9998;//4.IPprivate static String IP="127.0.0.1";//5.实例化public Client(){try {//6.开启选择器selector=Selector.open();//7.开启通道socketChannel=SocketChannel.open(new InetSocketAddress(IP,PORT));//8.设置非阻塞socketChannel.configureBlocking(false);//9.绑定端口IP// socketChannel.bind(new InetSocketAddress(IP,PORT));//10 监听读事件socketChannel.register(selector, SelectionKey.OP_READ);System.out.println("客户端准备好了");} catch (IOException e) {System.out.println("客户端连接失败");e.printStackTrace();}}public static void main(String[] args) {Client client=new Client();System.out.println("转发线程启动");new Thread(() -> {System.out.println("开始转发");client.readInfo();}).start();Scanner sc=new Scanner(System.in);while (sc.hasNext()){String msg= sc.nextLine();client.writrToServer(msg);System.out.println("-------------");}}private void writrToServer(String msg) {try {socketChannel.write(ByteBuffer.wrap(msg.getBytes()));} catch (IOException e) {e.printStackTrace();}}private void readInfo() {try {while(selector.select()>0) {Iterator it =selector.selectedKeys().iterator();while(it.hasNext()){//取数SelectionKey sk=it.next();if(sk.isReadable()){SocketChannel sc= (SocketChannel) sk.channel();ByteBuffer bf=ByteBuffer.allocate(1024);sc.read(bf);bf.flip();System.out.println(new String(bf.array(),0,bf.remaining()));System.out.println("----转发结束---------");}it.remove();}}} catch (IOException e) {e.printStackTrace();}}}

服务端:

public class Server {//1.private ServerSocketChannel sschannel;//2.private Selector selector;//3.定义端口private final int PORT=9998;//构造器public Server(){try {//开启选择器,初始化选择器selector=Selector.open();//开启通道sschannel=ServerSocketChannel.open();//设置非阻塞sschannel.configureBlocking(false);//设置连接sschannel.bind(new InetSocketAddress(PORT));//注册连接事件sschannel.register(selector, SelectionKey.OP_ACCEPT);} catch (IOException e) {e.printStackTrace();}}public void connect() {try {System.out.println("服务端准备就绪");//有连接的事件就一直循环等待while (selector.select()>0){//迭代所有事件Iterator it=selector.selectedKeys().iterator();while (it.hasNext()){//获取当前事件SelectionKey sk= it.next();//判断事件状态if(sk.isAcceptable()){//11.获取当前接入客户端通道SocketChannel sc= sschannel.accept();//设置事件通道阻塞sc.configureBlocking(false);//13.本客户端注册读事件到选择器sc.register(selector,SelectionKey.OP_READ);}else if(sk.isReadable()){clientGetData(sk);}it.remove();}}}catch (Exception e){}}private void clientGetData(SelectionKey sk) {//获取当前事件通道SocketChannel socketChannel= null;//分配空间ByteBuffer bf=ByteBuffer.allocate(1024);try {socketChannel= (SocketChannel) sk.channel();int leg=socketChannel.read(bf);if(leg>0){bf.flip();String msg=new String(bf.array(),0,bf.remaining());System.out.println("客户端接收消息:"+msg);sendMsgAllclient(msg,socketChannel);}} catch (IOException e) {System.out.println("有人离线了");try {sk.cancel();socketChannel.close();} catch (IOException ioException) {ioException.printStackTrace();}e.printStackTrace();}}private void sendMsgAllclient(String msg, SocketChannel socketChannel) {System.out.println("服务端开始转发这个消息,当前线程:"+Thread.currentThread().getName());for(SelectionKey skey : selector.keys()){Channel channel= skey.channel();if(channel instanceof SocketChannel && channel!=socketChannel){ByteBuffer buffer=ByteBuffer.wrap(msg.getBytes());try {((SocketChannel) channel).write(buffer);} catch (IOException e) {System.out.println("为啥没有收到");e.printStackTrace();}}}}public static void main(String[] args) {Server server=new Server();server.connect();}}

推荐阅读
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
author-avatar
拉着潜艇的鱼_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有