|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。
在JDK中,有一个十分成心思的库:NIO(NewI/O)。这个库中有3个主要的类,分离是java.nio.channels中Selector和Channel,和java.nio中的Buffer。
本篇文章我们起首懂得一下为何必要NIO来举行收集编程,然后看看一步一步来说解怎样在收集编程中利用NIO。
为何必要NIO
利用Java编写过Socket程序的同砚必定都晓得Socket和SocketServer。当挪用某个调用的时分,挪用的中央就会堵塞,守候呼应。这类体例关于小范围的程序十分便利,可是关于年夜型的程序就有点力所能及了,当有大批的毗连的时分,我们能够为每个毗连创建一个线程来操纵。可是这类做法带来的缺点也是不言而喻的:
1.硬件可以撑持大批的并发。
2.并发的数目一直有一个下限。
3.各个线程之间的优先级欠好把持。
4.各个Client之间的交互与同步坚苦。
我们也能够利用一个线程来处置一切的哀求,利用不堵塞的IO,轮询查询一切的Client。这类做法一样也出缺陷:没法敏捷呼应Client端,同时会损耗大批轮询查询的时间。
以是,我们必要一种poll的形式来处置这类情形,从大批的收集毗连中找出来真正需要服务的Client。这恰是NIO出生的缘故原由:供应一种Poll的形式,在一切的Client中找到必要服务的Client。
回到我们方才说到的3个最最主要的Class:java.nio.channels中Selector和Channel,和java.nio中的Buffer。
Channel代表一个能够被用于Poll操纵的对象(能够是文件流也能够使收集流),Channel可以被注册到一个Selector中。经由过程挪用Selector的select办法能够从一切的Channel中找到必要服务的实例(Accept,read..)。Buffer对象供应读写数据的缓存。相对我们熟习的Stream对象,Buffer供应更好的功能和更好的编程通明性(工资把持缓存的巨细和详细的操纵)。
共同Buffer利用Channel
与传统形式的编程不必,Channel不利用Stream,而是Buffer。我们来完成一个复杂的非堵塞EchoClient:
package com.cnblogs.gpcuster;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class TCPEchoClientNonblocking {
public static void main(String args[]) throws Exception {
if ((args.length < 2) || (args.length > 3))// Testforcorrect#ofargs
throw new IllegalArgumentException(
"Parameter(s): <Server> <Word> [<Port>]");
String server = args[0];// ServernameorIPaddress
// ConvertinputStringtobytesusingthedefaultcharset
byte[] argument = args[1].getBytes();
int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;
// Createchannelandsettononblocking
SocketChannel clntChan = SocketChannel.open();
clntChan.configureBlocking(false);
// Initiateconnectiontoserverandrepeatedlypolluntilcomplete
if (!clntChan.connect(new InetSocketAddress(server, servPort))) {
while (!clntChan.finishConnect()) {
System.out.print(".");// Dosomethingelse
}
}
ByteBuffer writeBuf = ByteBuffer.wrap(argument);
ByteBuffer readBuf = ByteBuffer.allocate(argument.length);
int totalBytesRcvd = 0;// Totalbytesreceivedsofar
int bytesRcvd;// Bytesreceivedinlastread
while (totalBytesRcvd < argument.length) {
if (writeBuf.hasRemaining()) {
clntChan.write(writeBuf);
}
if ((bytesRcvd = clntChan.read(readBuf)) == -1) {
throw new SocketException("Connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
System.out.print(".");// Dosomethingelse
}
System.out.println("Received:" + // converttoStringperdefaultcharset
new String(readBuf.array(), 0, totalBytesRcvd));
clntChan.close();
}
}
<p>
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。 |
|