- 浏览: 75082 次
- 性别:
- 来自: 西安
文章分类
NIO连接socket
一个是服务器端,一个是客户端,都是用NIO连接的,代码如下
客户端:
一个是服务器端,一个是客户端,都是用NIO连接的,代码如下
package testnio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Set; public class Receive { public static void main(String[] args) throws Exception { boolean b = true; ByteBuffer buffer = ByteBuffer.allocate(1024); ServerSocketChannel ss = ServerSocketChannel.open(); ss.socket().bind(new InetSocketAddress(8888)); ss.configureBlocking(false); Selector se = Selector.open(); ss.register(se, SelectionKey.OP_ACCEPT); while (se.select() > 0) { Set<SelectionKey> set = se.selectedKeys(); System.out.println("进入一个循环,大小是:" + set.size()); for (SelectionKey key : set) { int ops = key.readyOps(); System.out.println("ops=" + ops); if ((ops & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { SocketChannel sc = ss.accept(); System.err.println("有新的连接了" + sc); System.err.println("地址是:" + sc.socket()); sc.configureBlocking(false); sc.register(se, SelectionKey.OP_READ); } if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) { System.err.println("有新的读取"); SocketChannel sc = (SocketChannel) key.channel(); System.out.println(sc.isConnected()); sc.read(buffer); buffer.flip(); //System.out.println(new String(buffer.array())); Thread.sleep(5000); if (b) { b = false; sc.write(buffer); } } } set.clear(); System.out.println("退出循环"); } } }
客户端:
package testnio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Set; public class Send { public static void main(String[] args) throws Exception { SocketChannel sc = SocketChannel.open(); ByteBuffer buffer = ByteBuffer.allocate(1024); Selector se = Selector.open(); buffer.put("我是中国人,我爱我的祖国,hadeslee".getBytes()); buffer.flip(); sc.configureBlocking(false); sc.register(se, SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE); sc.connect(new InetSocketAddress("172.0.0.1", 8888)); while(!sc.finishConnect()); sc.write(buffer); System.out.println("进入循环"); Thread.sleep(10000); int sum = se.select(); while (se.select() > 0) { Thread.sleep(100); System.out.println("终于大于0了"); Set<SelectionKey> set = se.selectedKeys(); System.out.println("大小是:"+set.size()); for (SelectionKey key : set) { int ops = key.readyOps(); if ((ops & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT) { sc.write(buffer); System.out.println("连接成功"); } if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) { System.out.println(" 收到东西"); sc.read(buffer); buffer.flip(); System.out.println("收到的是:" + new String(buffer.array(),0,buffer.limit())); sc.write(buffer); } } se.selectedKeys().clear(); } } private static ByteBuffer[] get(String heads) { ByteBuffer[] bbs = new ByteBuffer[heads.length]; for (int i = 0; i < bbs.length; i++) { String s = heads[i]; bbs[i] = ByteBuffer.allocateDirect(1024); bbs[i].put(s.getBytes()); bbs[i].flip(); } return bbs; } }
发表评论
-
postgres java
2013-04-21 22:51 791postgres sql jdbc doc -
java NIO入门教程和实例代码
2012-03-19 23:32 871java NIO入门教程和实例代码 -
Java中ArrayList和LinkedList区别
2011-08-23 00:06 777一般大家都知道ArrayList和LinkedList的大致区 ... -
Hashtable和HashMap的区别
2011-08-22 23:04 799HashTable的应用非常广泛 ... -
Java中null关键字的用法
2011-08-22 23:03 1597一、null是代表不确定的对象Java中,null是一个关键字 ... -
java 文件锁
2011-02-21 01:02 31891:在javaN(new)IO 中提供了文件锁的功能, 这样 ... -
一个关于抽象类和接口的程序题
2011-01-06 20:10 791程序改错题: 原题是: package com. ... -
利用java可变参数初始化数组
2010-12-30 22:12 1450前几天初始化一维数组时 ,突发奇想利用java 5.0 以 ... -
java数组的排序和求数组中的最大值和最小值
2010-12-30 22:02 58572010-12-28 到 博彦科技去面试的一个面试题 ... -
java二维数组
2010-12-30 21:53 1322java 二维数组前几天面试时, 面试提既然考的是二维数组。 ... -
Java一道题
2009-09-07 15:16 1541最近闲着没事, 拿出java课本的两道题 ,用烦了Struts ... -
java5.0以后才有的枚举类型2
2009-09-06 17:48 995可以通过enum关键字来定义枚举类型时,例如下形式: ... -
java5.0以后才有的枚举类型1
2009-09-06 17:15 845在程序中经常要用到一些常数。 在jdk1.4 以前我们只能通过 ... -
java5.0以后才有的可变参数的方法
2009-09-05 15:29 1133java5.0以后才有的可变参数的方法,形式如下: 方法名 ... -
java 5.0以后才有的for循环2
2009-09-04 23:25 962//假设已有一个User[] us 的非空数组。 fo ... -
java 5.0以后才有的for循环
2009-09-04 22:55 804java 5.0以后才有的for循环 它主要和泛型结合才好用。 ...
相关推荐
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接的场景,如服务器端编程。在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了系统在处理大量并发连接时的效率。在这个“基于java NIO的socket通信demo...
《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...
`Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...
4. **SocketChannel**:Java NIO中的SocketChannel实现了Socket的功能,它允许非阻塞地进行TCP连接的读写操作。 - 打开与关闭:通过`open()`方法创建SocketChannel,`close()`方法关闭。 - 连接与接受:`connect()...
### JAVANIO在Socket通讯中的应用 #### 引言 在Java开发中,网络通信是常见需求之一,其中Socket编程是最基础也是最重要的技术之一。然而,在传统的Java Socket编程中,由于采用的是阻塞I/O模型,即所有的读写操作...
- **多路复用**:Java的Selector和Channel接口支持NIO(Non-blocking I/O),可以通过选择器同时监控多个Socket,提高长连接下的性能。 - **心跳包**:发送特定的无业务数据包,用于检查网络连接是否正常,防止TCP的...
将Java NIO与Socket结合,可以构建出高效、可扩展的网络应用程序。 1. **Java NIO基础** Java NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道类似于流,但它们可以同时读写,且...
总的来说,Java Socket结合NIO,能够构建出高性能的网络应用,尤其适用于需要处理大量并发连接的场景,如聊天服务器、流媒体服务等。`NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地...
描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...
Java NIO 的设计目的是为了克服传统Java IO API在面对大量并发连接时存在的性能瓶颈。 ##### 使用背景 传统的Java IO模型基于流(Stream),每次读写操作都是阻塞式的,即在读写操作完成之前,当前线程会被挂起等待...
在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...
#### 非阻塞式Socket通信:Java NIO的革命性突破 从JDK 1.4版本开始,Java引入了NIO(Non-blocking I/O)API,这标志着Java网络编程的一个重大转折点。传统上,基于阻塞I/O的网络编程模型在处理大量并发连接时效率...
第6节将聚焦于Java NIO中的Socket通道操作,这是网络编程中的重要一环。SocketChannel是基于TCP协议的,提供了一种可靠的数据传输方式。我们将学习如何创建和配置SocketChannel,以及如何通过它进行数据的读写。此外...
在Java中,Socket主要分为两种模式:BIO(Blocking I/O)和NIO(Non-blocking I/O)。这两个模式分别有不同的应用场景和优缺点。 **一、Java Socket BIO** BIO,即阻塞I/O模型,是Java最初提供的网络通信方式。在...