//--------------------------------------------------------------
// 输入输入对象
private ByteBuffer r_buff = ByteBuffer.allocate(1024);
private ByteBuffer w_buff = ByteBuffer.allocate(1024);
public byte[] networkForServer(byte[] toServerData) throws IOException{
byte[] result = new byte[]{};
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
InetSocketAddress s = new InetSocketAddress("125.46.49.88",9000);
channel.connect(s);
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_CONNECT|SelectionKey.OP_READ|SelectionKey.OP_WRITE);
// Charset charset=Charset.forName("GBK");
boolean isFinished = false;
int exec = 0; // 执行此时
while(!isFinished){
int n = selector.select();
if(n==0){
continue;
}
Iterator it = selector.selectedKeys().iterator();
while(it.hasNext()){
exec++;
SelectionKey skey = (SelectionKey)it.next();
debug("0"," count = " + exec +" ----- accept -->"+ skey.isAcceptable() +" connect --> " +skey.isConnectable()
+" read --> "+ skey.isReadable() +" valid --> " + skey.isValid() + " write --> " + skey.isWritable());
if(skey.isConnectable()){ // 是否连接
SocketChannel sc = (SocketChannel) skey.channel();
sc.configureBlocking(false);
sc.finishConnect();
sc.register(selector, SelectionKey.OP_READ);
debug("1","connect");
}
// 根据nio的注册状态,执行操作
if(skey.isReadable()){
debug("2","read");
readData(skey,selector);
}
if(skey.isWritable()){
debug("3","write");
ByteBuffer bbuffer = ByteBuffer.wrap(toServerData);
writeData(skey,bbuffer,selector);
}
if(exec==6){ // 第二次读取完了之后此时获取的是最后数据
// 关闭连接
skey.cancel();
channel.close();
isFinished = true; // 终止执行
}
it.remove();
}
/* if(num>0){
Set<SelectionKey> keys = selector.selectedKeys();
a++;
for(SelectionKey k:keys){
System.out.println(" ---- " + a +"---- accept -->"+ k.isAcceptable() +" connect --> " + k.isConnectable()
+" read --> "+ k.isReadable() +" valid --> " + k.isValid() + " write --> " + k.isWritable());
if(k.isConnectable()){
SocketChannel sc = (SocketChannel) k.channel();
sc.configureBlocking(false);
sc.finishConnect();
sc.register(selector, SelectionKey.OP_READ);
System.out.println(" --> 1" );
ByteBuffer bb = ByteBuffer.wrap(toServerData);
sc.write(bb);
} else if (k.isReadable()) {
ByteBuffer echoBuffer = ByteBuffer.allocate(1024);
SocketChannel sc = (SocketChannel) k.channel();
//---------------------------
int len = 0;
len = sc.read(echoBuffer);
echoBuffer.flip();
result = echoBuffer.array();
System.out.println("echo server return:data len -->"+ echoBuffer.limit() +" len = " + len);
getResponseHeader(result);
// +charset.decode(echoBuffer).toString());
echoBuffer.clear();
sc.finishConnect();
k.cancel();
sc.close();
}
}
} */
}
return result;
}
public void readData(SelectionKey k,Selector selector) throws IOException{
int count = 0;
SocketChannel sc = (SocketChannel) k.channel();
r_buff.clear();
while((count=sc.read(r_buff))>0){ //循环读取r_buff
//确保r_buff可读
r_buff.flip();
// 把数据拿出来并显示
byte[] result = r_buff.array();
System.out.println("echo server return:data len -->"+ r_buff.limit() +" len = " + count);
getResponseHeader(result);
r_buff.clear();
}
sc.register(selector, SelectionKey.OP_WRITE);
}
public void writeData(SelectionKey k,ByteBuffer bbuffer,Selector selector) throws IOException{
SocketChannel sc = (SocketChannel) k.channel();
w_buff.clear();
w_buff.put(bbuffer);
w_buff.flip();
echo2Server(sc);
w_buff.clear();
sc.register(selector, SelectionKey.OP_READ);
}
// 向服务端发数据
public void echo2Server(SocketChannel sc) throws IOException {
while(w_buff.hasRemaining()){
sc.write(w_buff);
}
}
public void debug(String msgId,String message){
System.out.println("debug("+ msgId+") --> " + message );
}
注意:此段代码是循环执行,用的时候需要修改循环参数。
分享到:
相关推荐
总之,Java NIO非阻塞服务端与客户端通信的关键在于利用非阻塞IO和选择器,实现高效的多路复用,有效利用系统资源,提升并发处理能力。通过实践本教程中的代码示例,你将能够清晰地理解这一概念并掌握其应用技巧。
Java NIO通过引入非阻塞通信机制,显著提高了Java应用程序在网络通信和文件处理方面的性能。通过合理利用缓冲区、通道和选择器等组件,开发人员可以构建出高效且可扩展的应用程序。尽管非阻塞通信带来了很多优势,但...
总之,Java非阻塞通信的研究涵盖了Java NIO和NIO.2的核心机制,以及如何在实际项目中应用这些技术来构建高并发、低延迟的系统。通过深入理解这些概念,开发者能够构建出更加高效、可扩展的Java应用程序。《Java非...
总之,非阻塞Java通信通过Java NIO库实现了高效的网络编程,通过非阻塞I/O和事件驱动,使得服务器能够处理更多的并发连接,提高了系统的整体性能。`Server.java`和`Client.java`的代码将具体展示如何在Java中实现这...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一个新特性,旨在提供一种比传统的IO(I/O)模型更高效、性能更好的处理输入和输出的方式。传统的Java IO基于流(Stream)...
在Java编程语言中,Socket是网络通信的基本组件,它提供了进程间网络通信的能力。而NIO(Non-blocking Input/Output,非阻塞I/O)是Java提供的一个高性能的I/O模型,与传统的阻塞I/O相比,NIO具有更高的并发性能。本...
### Java非阻塞式通信详解 #### 一、线程阻塞的概念与影响 线程阻塞是指在程序运行过程中,线程遇到某些条件而暂时停止执行的状态,这种状态下线程将不会消耗CPU资源,直到阻塞条件解除。在传统的Java网络编程中,...
Java非阻塞套接字是Java 1.4引入的一项重要特性,它是Java NIO(New Input/Output)的一部分,提供了高效、灵活且可扩展的网络通信能力。非阻塞套接字允许在网络通信中使用套接字时,不会因为等待数据而阻塞应用程序...
Java NIO(非阻塞I/O)Socket编程是此工具的核心技术之一。传统的Java Socket编程是基于阻塞I/O,当一个线程进行读写操作时,若数据未准备好,线程会被阻塞。而NIO引入了选择器和通道的概念,允许多个通道的并发读写...
在深入探讨Java网络编程中的非阻塞与阻塞编程之前,我们先来了解这两个概念的基本含义。阻塞编程,通常指的是在程序执行过程中,当某一部分代码遇到I/O操作时,如读写文件或网络通信,整个程序会暂停运行,等待I/O...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...
在这个基于NIO非阻塞的Java聊天demo中,我们将会看到如何利用NIO实现一个支持单聊和群聊的应用。 首先,NIO的核心组件包括Channel、Buffer、Selector和Pipe。在传统的IO模型中,数据是从流的一端流向另一端,而在...
Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...
为此,Java非阻塞通信技术应运而生,它基于Java NIO(New I/O)包的全新设计理念,为服务端的高并发处理提供了新的解决方案。 Java NIO的非阻塞通信机制,与传统阻塞式通信的最大区别在于它采用了事件驱动的方式...
在NIO中,`java.nio.channels.SocketChannel`代表了一个TCP连接,可以用来进行非阻塞的读写操作。 4. **服务器端实现**: 服务器端通常包含以下步骤: - 打开ServerSocketChannel并绑定到特定端口。 - 注册...
NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许程序非阻塞地读写数据,这对于开发高性能的服务器应用尤其有用。 描述中的“java nio 编程一个实例子.服务端程序”提示我们,这个实例是一个服务器端的...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了程序处理高并发I/O操作的效率。这个例子包含了NIO在网络通信中的应用,...
总的来说,这个示例展示了如何使用Java NIO进行Socket通信,通过非阻塞的方式提高系统的并发处理能力。同时,它还演示了如何处理字符集问题,保证了跨平台数据交换的准确性。对于理解和实践Java NIO在网络编程中的...
Java NIO提供了多种通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信。通道是双向的,可以同时进行读写操作。 - **缓冲区(Buffers)**:缓冲区是数据存储的地方,它是Java NIO的...