热门标签 | 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();}}

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
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社区 版权所有