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
閱讀(2803)
評(píng)論(1)
編輯
收藏
所屬分類:
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:
博客園
模板提供:
滬江博客
<
2014年11月
>
日
一
二
三
四
五
六
26
27
28
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
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(1)
給我留言
查看公開(kā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)
文章分類
(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)用
搜索
積分與排名
積分 - 96785
排名 - 600
最新評(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)使用(3232)
2.?Linux下C訪問(wèn)MySQL實(shí)踐(3143)
3.?Java NIO Demo(2803)
4.?創(chuàng)建mysql innodb數(shù)據(jù)庫(kù)(2643)
5.?JDBC SavePoint淺析(2541)
評(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)
主站蜘蛛池模板:
国产亚洲大尺度无码无码专线
|
麻豆成人久久精品二区三区免费
|
精品久久久久久亚洲中文字幕
|
亚洲精品国产成人片
|
亚洲高清资源在线观看
|
亚洲午夜无码久久久久软件
|
国产精品成人免费观看
|
国产精彩免费视频
|
亚洲精品美女久久777777
|
久久久久久噜噜精品免费直播
|
99久久这里只精品国产免费
|
亚洲av无码一区二区三区乱子伦
|
亚洲AV无码一区二区乱子仑
|
91九色老熟女免费资源站
|
亚洲国产精品成人一区
|
亚洲Av永久无码精品一区二区
|
国产精品国产免费无码专区不卡
|
亚洲天堂一区二区
|
free哆拍拍免费永久视频
|
亚洲男人第一无码aⅴ网站
|
亚洲一区二区三区不卡在线播放
|
男女作爱在线播放免费网站
|
亚洲一区二区精品视频
|
国产亚洲精品2021自在线
|
成年女人18级毛片毛片免费观看
|
亚洲AV人无码激艳猛片
|
国产综合免费精品久久久
|
亚洲А∨精品天堂在线
|
中文字幕视频在线免费观看
|
亚洲色成人网一二三区
|
免费鲁丝片一级在线观看
|
亚洲第一男人天堂
|
一二三四在线观看免费高清中文在线观看
|
免费无码又爽又刺激高潮的视频
|
免费看一级一级人妻片
|
免费无码看av的网站
|
国产在线观看xxxx免费
|
亚洲日韩精品一区二区三区无码
|
四虎影视久久久免费观看
|
无码国产亚洲日韩国精品视频一区二区三区
|
狠狠色伊人亚洲综合网站色
|