zhangxl_blog
路漫漫其修遠(yuǎn)兮,吾將上下而求索!
BlogJava
首頁(yè)
新隨筆
新文章
聯(lián)系
聚合
管理
posts - 28, comments - 15, trackbacks - 0
Java NIO Demo
在讀Amoeba源碼的時(shí)候,里面采用java NIO進(jìn)行通信管理,以前也了解過(guò)一些關(guān)于這方面的知識(shí)但是都不太系統(tǒng),最近兩天抽時(shí)間對(duì)這塊進(jìn)行一下掃盲。我主要參考以下兩篇文章,個(gè)人認(rèn)為這兩篇文章還是不錯(cuò)的入門(mén)級(jí)文章,講的比較通俗易懂。
1.
http://www.ibm.com/developerworks/cn/education/java/j-nio/section11.html
比較系統(tǒng)的講述了Channel(通道)、Buffer(緩沖區(qū))、position,limit,
capacity
in buffer等;其示例代碼在:
http://code.google.com/p/astudy/source/browse/trunk/applications/astudy/nio/MultiPortEcho.java?spec=svn141&r=141
下
2.
http://tutorials.jenkov.com/java-nio/index.html
這個(gè)站點(diǎn)也是一個(gè)不錯(cuò)的入門(mén)級(jí)別介紹,雖然是e文,但講解的比較細(xì)致。
3.我的demo
這個(gè)小例子,模擬了一個(gè)echo服務(wù),客戶端向echo服務(wù)器發(fā)送一段信息,echo收到信息后,返回給客戶端,然后,連接關(guān)閉。代碼如下:
/** */
/**
************************************
*/
客戶端代碼:
package
com.zxl.channel;
import
java.io.IOException;
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.nio.charset.Charset;
import
java.util.Set;
public
class
EchoClient
{
/** */
/**
*
@param
args
*
@throws
IOException
*/
public
static
void
main(String[] args)
throws
IOException
{
SocketChannel channel
=
SocketChannel.open();
channel.configureBlocking(
false
);
InetSocketAddress s
=
new
InetSocketAddress(
"
localhost
"
,
2000
);
channel.connect(s);
Selector selector
=
Selector.open();
channel.register(selector, SelectionKey.OP_CONNECT
|
SelectionKey.OP_READ);
Charset charset
=
Charset.forName(
"
GBK
"
);
boolean
isFinished
=
false
;
while
(
!
isFinished)
{
int
num
=
selector.select();
if
(num
>
0
)
{
Set
<
SelectionKey
>
keys
=
selector.selectedKeys();
for
(SelectionKey k:keys)
{
if
(k.isConnectable())
{
SocketChannel sc
=
(SocketChannel) k.channel();
sc.configureBlocking(
false
);
sc.finishConnect();
sc.register(selector, SelectionKey.OP_READ);
ByteBuffer echoBuffer
=
ByteBuffer.allocate(
1024
);
ByteBuffer info
=
charset.encode(
"
好了克隆技術(shù)杜洛克防水堵漏開(kāi)發(fā)!
"
);
echoBuffer.put(info);
echoBuffer.flip();
sc.write(echoBuffer);
echoBuffer.clear();
}
else
if
(k.isValid()
&&
k.isReadable())
{
ByteBuffer echoBuffer
=
ByteBuffer.allocate(
1024
);
SocketChannel sc
=
(SocketChannel) k.channel();
sc.read(echoBuffer);
echoBuffer.flip();
System.out.println(
"
echo server return:
"
+
charset.decode(echoBuffer).toString());
echoBuffer.clear();
isFinished
=
true
;
k.cancel();
sc.close();
selector.close();
}
}
}
}
}
}
/** */
/**
******************************************
*/
服務(wù)端代碼:
package
com.zxl.channel;
import
java.io.IOException;
import
java.net.InetSocketAddress;
import
java.net.ServerSocket;
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.nio.charset.Charset;
import
java.util.Iterator;
import
java.util.Set;
public
class
MultiPortEchoServer
{
private
Charset charset
=
Charset.forName(
"
GBK
"
);
private
int
[] ports;
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
int
[] ps
=
{
2000
,
2001
}
;
//
默認(rèn)監(jiān)聽(tīng)2000,2001端口
new
MultiPortEchoServer(ps);
}
public
MultiPortEchoServer(
int
[] ports)
{
this
.ports
=
ports;
try
{
go();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
public
void
go()
throws
IOException
{
Selector selector
=
Selector.open();
for
(
int
i
=
0
;i
<
ports.length;i
++
)
{
ServerSocketChannel channel
=
ServerSocketChannel.open();
channel.configureBlocking(
false
);
ServerSocket socket
=
channel.socket();
InetSocketAddress address
=
new
InetSocketAddress(
"
localhost
"
,ports[i]);
socket.bind(address);
//
注冊(cè)接受連接事件
channel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println(
"
Going to listen on
"
+
ports[i] );
}
while
(
true
)
{
int
num
=
selector.select();
Set
<
SelectionKey
>
keys
=
selector.selectedKeys();
Iterator
<
SelectionKey
>
iter
=
keys.iterator();
while
(iter.hasNext())
{
SelectionKey key
=
iter.next();
if
((key.readyOps()
&
SelectionKey.OP_ACCEPT)
==
SelectionKey.OP_ACCEPT)
{
ServerSocketChannel ssc
=
(ServerSocketChannel) key.channel();
SocketChannel sc
=
ssc.accept();
sc.configureBlocking(
false
);
sc.register(selector, SelectionKey.OP_READ);
iter.remove();
}
else
if
((key.readyOps()
&
SelectionKey.OP_READ)
==
SelectionKey.OP_READ)
{
SocketChannel sc
=
(SocketChannel) key.channel();
if
(
!
sc.isOpen())
{
selector
=
Selector.open();
}
else
{
ByteBuffer echoBuffer
=
ByteBuffer.allocate(
1024
);
//
int x = sc.read(echoBuffer);
while
(sc.read(echoBuffer)
>
0
)
{
System.out.println(
"
Echoed
"
+
charset.decode(echoBuffer).toString()
+
"
from
"
+
sc.socket().getInetAddress().getHostAddress() );
echoBuffer.flip();
sc.write(echoBuffer);
echoBuffer.clear();
}
iter.remove();
/**/
/*
返回信息后關(guān)閉連接
*/
key.cancel();
sc.close();
}
}
}
keys.clear();
}
}
}
posted on 2011-06-30 16:24
zhangxl
閱讀(2793)
評(píng)論(1)
編輯
收藏
所屬分類(lèi):
java concurrency
FeedBack:
#
re: Java NIO Demo
2014-11-24 09:47 |
zuidaima
java demo學(xué)習(xí)實(shí)例教程源代碼下載:
http://zuidaima.com/share/kjava-p1-s1.htm
回復(fù)
更多評(píng)論
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
使用java nio 實(shí)現(xiàn) Ping
Java NIO Demo
Copyright ©2025 zhangxl Powered by:
博客園
模板提供:
滬江博客
<
2011年6月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(1)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
(17)
arithmetics(3)
C/C++(1)
Cache
DB(1)
IOC/AOP(2)
java concurrency(2)
java 多線程
JDK(1)
JVM(1)
Linux(1)
nosql(5)
Performance
隨筆檔案
(28)
2014年7月 (3)
2014年5月 (1)
2014年4月 (1)
2013年6月 (1)
2013年4月 (2)
2013年3月 (1)
2012年8月 (1)
2012年5月 (1)
2012年2月 (6)
2012年1月 (1)
2011年10月 (1)
2011年9月 (1)
2011年6月 (2)
2009年8月 (3)
2008年5月 (1)
2006年4月 (2)
文章分類(lèi)
(30)
AJAX
common(3)
DB(3)
java tools(1)
JAVA 基礎(chǔ)文章(1)
java 并發(fā)(3)
JDBC(1)
linux(3)
ORM(包括hibernate等)(2)
Spring(6)
SWT、SWING、AWT(2)
web(2)
web service
優(yōu)化(2)
版本控制(1)
文章檔案
(30)
2013年4月 (1)
2013年3月 (1)
2012年1月 (2)
2011年12月 (1)
2011年11月 (1)
2011年8月 (2)
2011年7月 (1)
2011年6月 (4)
2011年4月 (3)
2009年8月 (4)
2008年6月 (1)
2008年4月 (1)
2007年3月 (2)
2006年12月 (1)
2006年10月 (2)
2006年8月 (1)
2006年6月 (1)
2006年4月 (1)
相冊(cè)
my picture
收藏夾
(2)
我的關(guān)注(2)
hibernate
java基礎(chǔ)
serialization
mysql
mysql debin
xml
IBM XSL
w3c標(biāo)準(zhǔn)的xpath說(shuō)明
web service ibm
XPath 示例
XPath 簡(jiǎn)單語(yǔ)法
XQuery 1.0 and XPath 2.0 Full-Text Use Cases
關(guān)注
Doug Lea's Home Page
壓力測(cè)試
JMeter使用技巧
算法
排列組合算法
最新隨筆
1.?解決Redis數(shù)據(jù)庫(kù)響應(yīng)延遲問(wèn)題(轉(zhuǎn)載)
2.?理想化的 Redis 集群 (轉(zhuǎn)載)
3.?Redis 分區(qū)(翻譯)
4.?Mysql索引相關(guān)知識(shí)分享
5.?數(shù)據(jù)結(jié)構(gòu)-BinaryTree
6.?深入學(xué)習(xí)Linux之命令篇-find
7.?什么情況下應(yīng)該使用GridFS(翻譯)
8.?Mongodb主從復(fù)制實(shí)踐
9.?jmap使用
10.?為什么實(shí)現(xiàn)了equal方法,一定需要實(shí)現(xiàn)hashCode方法呢?
11.?MongoDB學(xué)習(xí)—MongoDB安裝
12.?京東碰到的一道面試題
13.?HashMap分析
14.?12個(gè)小球其中有一個(gè)是次品,不過(guò)不知道輕重,請(qǐng)問(wèn)用天平能用三次測(cè)量的機(jī)會(huì)找出那個(gè)次品嗎?
15.?使用java nio 實(shí)現(xiàn) Ping
16.?Spring 源碼閱讀(IOC容器)-容器啟動(dòng)2
17.?Spring 源碼閱讀(IOC容器)-容器啟動(dòng)1
18.?JDBC SavePoint淺析
19.?Linux下C訪問(wèn)MySQL實(shí)踐
20.?Apache Benchmark(ab)使用
21.?Java NIO Demo
22.?Amoeba源碼解讀一
23.?編寫(xiě)跨平臺(tái)代碼注意事項(xiàng)
24.?編寫(xiě)跨平臺(tái)代碼注意事項(xiàng)
25.?JavaScript的toString()方法自動(dòng)調(diào)用
搜索
積分與排名
積分 - 96299
排名 - 601
最新評(píng)論
1.?嗯嗯
阿斯達(dá)斯
--安德森
2.?re: tomcat 產(chǎn)生heapdump文件配置
如果不內(nèi)存溢出,heapdump目錄是不是空的?
--小龍?jiān)诰€
3.?re: Java NIO Demo
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--zuidaima
4.?re: Redis 分區(qū)(翻譯)
手機(jī)賺錢(qián)軟件
http://www.szapk.cn
!!!
--手機(jī)賺錢(qián)軟件http://www.szapk.cn
5.?re: Mysql索引相關(guān)知識(shí)分享
很有價(jià)值的分享,值得學(xué)習(xí)
--任務(wù)大廳
閱讀排行榜
1.?Apache Benchmark(ab)使用(3227)
2.?Linux下C訪問(wèn)MySQL實(shí)踐(3138)
3.?Java NIO Demo(2793)
4.?創(chuàng)建mysql innodb數(shù)據(jù)庫(kù)(2637)
5.?JDBC SavePoint淺析(2534)
評(píng)論排行榜
1.?Mysql索引相關(guān)知識(shí)分享(4)
2.?京東碰到的一道面試題(1)
3.?Linux下C訪問(wèn)MySQL實(shí)踐(1)
4.?Apache Benchmark(ab)使用(1)
5.?Java NIO Demo(1)
6.?JavaScript的toString()方法自動(dòng)調(diào)用(1)
7.?lucene 實(shí)踐(1)
8.?Redis 分區(qū)(翻譯)(1)
9.?解決Redis數(shù)據(jù)庫(kù)響應(yīng)延遲問(wèn)題(轉(zhuǎn)載)(0)
10.?理想化的 Redis 集群 (轉(zhuǎn)載)(0)
11.?dom4j學(xué)習(xí)筆記(0)
12.?創(chuàng)建mysql innodb數(shù)據(jù)庫(kù)(0)
13.?Amoeba源碼解讀一(0)
14.?編寫(xiě)跨平臺(tái)代碼注意事項(xiàng)(0)
15.?編寫(xiě)跨平臺(tái)代碼注意事項(xiàng)(0)
16.?HashMap分析(0)
17.?12個(gè)小球其中有一個(gè)是次品,不過(guò)不知道輕重,請(qǐng)問(wèn)用天平能用三次測(cè)量的機(jī)會(huì)找出那個(gè)次品嗎?(0)
18.?使用java nio 實(shí)現(xiàn) Ping(0)
19.?Spring 源碼閱讀(IOC容器)-容器啟動(dòng)2(0)
20.?Spring 源碼閱讀(IOC容器)-容器啟動(dòng)1(0)
主站蜘蛛池模板:
久久亚洲精品无码观看不卡
|
亚洲综合日韩中文字幕v在线
|
无码专区—VA亚洲V天堂
|
精品久久亚洲中文无码
|
一级特黄a大片免费
|
免费A级毛片无码A∨免费
|
免费jlzzjlzz在线播放视频
|
亚洲国产一区国产亚洲
|
国产成人久久精品亚洲小说
|
日本在线看片免费
|
国产精品极品美女免费观看
|
亚洲视频在线视频
|
黄色毛片视频免费
|
亚洲天堂免费在线
|
国产亚洲一区二区手机在线观看
|
青青青国产在线观看免费
|
精品国产香蕉伊思人在线在线亚洲一区二区
|
亚洲真人日本在线
|
亚洲日韩国产AV无码无码精品
|
97在线免费视频
|
精品久久洲久久久久护士免费
|
亚洲av福利无码无一区二区
|
麻豆91免费视频
|
免费下载成人电影
|
亚洲AV无码专区国产乱码电影
|
国产永久免费高清在线
|
日本免费一区尤物
|
亚洲国产精品综合久久2007
|
久久久久久国产a免费观看不卡
|
夜夜爽免费888视频
|
亚洲欧洲国产精品久久
|
a成人毛片免费观看
|
亚洲Av无码乱码在线znlu
|
亚洲第一男人天堂
|
97青青草原国产免费观看
|
国产AV无码专区亚洲AV手机麻豆
|
黄色三级三级三级免费看
|
成全影视免费观看大全二
|
亚洲最大免费视频网
|
久久久久久久久久国产精品免费
|
亚洲人成色77777在线观看大
|