編輯:中級開發
下面我們以一個簡單的Echo Server為例子來分析
import Java.io.IOException;
import Java.Net.InetSocketAddress;
import Java.nio.ByteBuffer;
import Java.nio.CharBuffer;
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.nio.charset.CharsetDecoder;
import Java.nio.charset.CharsetEncoder;
import Java.util.Iterator;
public class Server {
public static void main(String[] args) {
Selector selector = null;
ServerSocketChannel ssc = null;
try {
selector = Selector.open(); //實例化selector
ssc = ServerSocketChannel.open(); //實例化ServerSocketChannel 對象
ssc.socket().bind(new InetSocketAddress(1987)); //綁定端口為1987
ssc.configureBlocking(false); //設置為非阻塞模式
ssc.register(selector, SelectionKey.OP_ACCEPT); //注冊關心的事件,對於Server來說主要是accpet了
while (true) {
int n= selector.select(); //獲取感興趣的selector數量
if(n<1)
continue; //如果沒有則一直輪訓檢查
Iterator<SelectionKey> it = selector.selectedKeys().iterator(); //有新的鏈接,我們返回一個SelectionKey集合
while (it.hasNext()) {
SelectionKey key = it.next(); //使用迭代器遍歷
it.remove(); //刪除迭代器
if (key.isAcceptable()) { //如果是我們注冊的OP_ACCEPT事件
ServerSocketChannel ssc2 = (ServerSocketChannel) key.channel();
SocketChannel channel = ssc2.accept();
channel.configureBlocking(false); //同樣是非阻塞
channel.register(selector, SelectionKey.OP_READ); //本次注冊的是read事件,即receive接受
System.out.println("CWJ ClIEnt :" + channel.socket().getInetAddress().getHostName() + ":" + channel.socket().getPort());
}
else if (key.isReadable()) { //如果為讀事件
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024); //1KB的緩沖區
channel.read(buffer); //讀取到緩沖區
buffer.flip(); //准備寫入
System.out.println("android123 receive info:" + buffer.toString());
channel.write(CharBuffer.wrap("it works".getBytes())); //返回給客戶端
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
selector.close();
server.close();
} catch (IOException e) {
}
}
}
}
上面是比較簡單的框架,裡面存在很多問題,android123將在下次詳細闡述下,上面或者說國內有關NIO資料中的通病,如果你看過Mina或GlassFish的源碼,你可能就知道上面的問題大於10種,有關框架的bug占了大多數,作為服務器而言很容易CPU超過100%
簡介: 有幾個網站從事一些非盈利服務,提供一些可輕松設置和使用的表單來進行民意測驗和數據收集。本教程介紹一個簡單的架構來為 android 設計類似的應用程
簡介: 本文詳細介紹了 Android 應用編程中 Activity 的生命周期、通信方式和 Intent Filter 等內容,並提供了一些日常開發中經常用
收集用戶數據您已經創建了 Activity 主屏幕布局,現在可以創建用戶界面表單來收集數據了。在本例中,您將創建一個 Robotics Club R
簡介: HTML 5 中一個最有用的新特性是本地存儲的標准化。最終,Web 開發人員可以不再試圖將所有客戶端數據都填塞到 4 KB 的 CookIEs 中。現