服務器端的Selector僅需要監聽兩種操作
使用NIO來實現服務器時
本示例程序的客戶端程序需要兩個線程
程序清單
public class NClient
{
//定義檢測SocketChannel的Selector對象
private Selector selector = null;
//定義處理編碼和解碼的字符集
private Charset charset = Charset
//客戶端SocketChannel
private SocketChannel sc = null;
public void init()throws IOException
{
selector = Selector
InetSocketAddress isa = new InetSocketAddress(
//調用open靜態方法創建連接到指定主機的SocketChannel
sc = SocketChannel
//設置該sc以非阻塞方式工作
sc
//將SocketChannel對象注冊到指定Selector
sc
//啟動讀取服務器端數據的線程
new ClientThread()
//創建鍵盤輸入流
Scanner scan = new Scanner(System
while (scan
{
//讀取鍵盤輸入
String line = scan
//將鍵盤輸入的內容輸出到SocketChannel中
sc
}
}
//定義讀取服務器數據的線程
private class ClientThread extends Thread
{
public void run()
{
try
{
while (selector
{
//遍歷每個有可用IO操作Channel對應的SelectionKey
for (SelectionKey sk : selector
{
//刪除正在處理的SelectionKey
selector
//如果該SelectionKey對應的Channel中有可讀的數據
if (sk
{
//使用NIO讀取Channel中的數據
SocketChannel sc = (SocketChannel)sk
ByteBuffer buff = ByteBuffer
String content =
while(sc
{
sc
buff
content += charset
}
//打印輸出讀取的內容
System
//為下一次讀取作准備
sk
}
}
}
}
catch (IOException ex)
{
ex
}
}
}
public static void main(String[] args)
throws IOException
{
new NClient()
}
}
相比之下
返回目錄
編輯推薦
Java程序性能優化
新手學Java
Java程序設計培訓視頻教程
[
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27262.html