NIO连接socket
早就听说JAVA的NIO比IO牛一些,可是牛在哪里一直都不知道,并且NIO比IO难学,搞了半天终于用NIO弄了两个程序,一个是服务器端,一个是客户端,都是用NIO连接的,代码如下,注释比较少,输出比较多:)
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
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;
/**
*
* @author hadeslee
*/
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("退出循环");
}
}
}
客户端:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
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;
/**
*
* @author hadeslee
*/
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("192.168.1.58", 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;
}
}
有机会再好好研究它们之间的更加具体的用法,以上的只是一个简单的,能互连的一个例子.
分享到:
相关推荐
《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
1. **SocketChannel**:这是NIO中的客户端连接通道,用于代替传统的`Socket`。`SocketChannel`可以从服务器接收数据,也可以向服务器发送数据。与`Socket`不同的是,`SocketChannel`是非阻塞的,这意味着当没有数据...
**Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心特点是能够进行多路复用,即一个线程可以同时处理多个连接,这使得NioSocket在高并发场景下具有较好的性能表现。 服务器端...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了系统在处理大量并发连接时的效率。在这个“基于java NIO的socket通信demo...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...
`Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...
总的来说,Java Socket结合NIO,能够构建出高性能的网络应用,尤其适用于需要处理大量并发连接的场景,如聊天服务器、流媒体服务等。`NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地...
2. 并发能力:Mina NIO的并发能力远超普通Socket,因为其可以有效利用线程资源,处理更多连接。 3. 开发复杂度:Mina NIO需要对Java NIO有深入理解,而普通Socket相对简单,学习曲线较平缓。 4. 扩展性:Mina提供了...
标题中的“网络与nio”指的是Java的非阻塞I/O(Non-blocking Input/Output),它是一种高效的I/O处理模型,特别是在处理大量并发连接时。在传统的阻塞I/O模式下,当一个线程进行读写操作时,如果数据未准备好,该...
创建一个简单的NIO Socket服务器,需要创建`ServerSocketChannel`,监听连接,然后对每个连接创建`SocketChannel`,将其注册到选择器上,处理读写事件。客户端则创建`SocketChannel`,连接服务器,然后进行数据传输...
### JAVANIO在Socket通讯中的应用 #### 引言 在Java开发中,网络通信是常见需求之一,其中Socket编程是最基础也是最重要的技术之一。然而,在传统的Java Socket编程中,由于采用的是阻塞I/O模型,即所有的读写操作...
在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...
在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...
NIO(Non-blocking I/O)是Java提供的一个高效I/O模型,相较于传统的IO模型,NIO具有非阻塞、多路复用等特性,能够更好地处理大量并发连接。本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的...
"android-socket-nio-master.zip" 是一个关于Android中使用Socket结合NIO实现高效通信的项目,其目标是提高Socket通信的性能和处理大量并发连接的能力。 NIO(非阻塞I/O)是Java提供的一个替代传统I/O的API,主要...
至此,我们已经创建了一个简单的NIO Socket服务器,能够接受客户端连接并进行数据传输。实际应用中,还需要考虑异常处理、多线程处理客户端、关闭资源等细节。通过阅读提供的“NIO_Sample”压缩包中的代码示例,可以...