tcp::
1.接口:
導入java.nio.channels.selectionkey;導入java.io.ioexception;公共接口Echoprotocol {void handleaccept(selectionkey鍵)拋出ioexception; void handleread(selectionkey鍵)拋出ioexception; void handlewrite(selectionkey鍵)拋出ioexception; }2.實現::
導入Java.nio.Channels。 *;導入Java.nio.Bytebuffer;導入java.io.ioexception;公共類TCPeChoselectorProtocol實施Echoprotocol {private int bufsize; // i/o緩衝區public echoselectorProtocol(int bufsize)的大小{this.bufsize = bufsize; } public void handleaccept(selectionkey鍵)拋出ioException {socketchannel clntchan =(((serversocketchannel)key.channel())。 clntchan.configureblocking(false); //必須是不塊的,以註冊//在讀取新通道上註冊選擇器,以讀取和附加字節buffer clntchan.register(key.selecter(),selectionkey.op_read,bytebuffer.allocate.allocate(bufsize)); } public void handleread(selectionkey鍵)拋出ioException {//客戶端套接字通道已待定數據socketchannel clntchan =(socketchannel)key.channel(); bytebuffer buf =(bytebuffer)key.attachment();長bytesread = clntchan.Read(buf); if(bytesread == -1){//另一個結束是否關閉? clntchan.close(); } else if(bytesread> 0){//通過鍵指出,閱讀/寫作現在都很有趣。 key.interestops(selectionkey.op_read | selectionkey.op_write); }} public void handlewrite(selectionkey鍵)拋出ioexception { / * *頻道可用於編寫,並且密鑰是有效的(即,客戶端頻道 *未關閉)。 */ //檢索讀取的數據早期bytebuffer buf =(bytebuffer)key.attachment(); buf.flip(); //準備緩衝區編寫socketchannel clntchan =(socketchannel)key.channel(); clntchan.write(buf); if(! buf.hasremaining()){//緩衝區完全編寫? //什麼都沒有,所以不再對Writes key.interestops(selectionkey.op_read)感興趣; } buf.compact(); //騰出空間以閱讀更多數據}}二、 nio tcp客戶端:
導入java.net.inetsocketaddress;導入java.net.socketException;導入Java.nio.Bytebuffer;導入java.nio.channels.socketchannel;公共類TCPECHOCLIENTNONONBLOCKING {public static void main(String args [])引發異常{String Server =“ 127.0.0.1.1”; //使用默認的charset byte []參數=“ 0123456789abcdefghijklmnopqrstuvwxyz” .getBytes(); int servport = 5500; //創建通道並將設置為非塊Socketchannel clntchan = socketchannel.open(); clntchan.configureblocking(false); //啟動連接到服務器,然後重複進行輪詢,直到完成(! //做其他事情}} bytebuffer writebuf = bytebuffer.wrap(gright); bytebuffer readbuf = bytebuffer.allocate(grigent.length); int totalbytesrcvd = 0; //到目前為止收到的總字節int bytesrcvd; //在上次讀取中收到的字節while(totalbytesrcvd <gright.length){if(writebuf.hasremaining()){clntchan.write(writebuf); } if(((bytesrcvd = clntchan.read(readbuf)))== -1){拋出新的socketException(“連接過早關閉”); } totalbytesrcvd += bytesrcvd; system.out.print(“。”); //做其他事情} system.out.println(“接收:” + //每個默認的charset new String(dectBuf.Array(),0,totalbytesrcvd).length()).length()); clntchan.close(); }}}三、 nio tcp服務端:
導入java.io.ioexception;導入java.net.inetsocketaddress;導入Java.nio.Channels。 *;導入java.util.iterator;公共類TCPSerVersElector {私有靜態最終int int bufsize = 256; //緩衝區大小(字節)私有靜態最終int超時= 3000; //等待超時(毫秒)public static void main(string [] args)拋出ioexception {int [] ports = {5500}; //創建一個為多路復用偵聽插座的選擇器和連接選擇器Selector = selector.open(); //為每個端口創建收聽套接字通道,並為(int端口:端口){serversocketchannel listNChannel = serversocketchannel.open(); listnChannel.socket()。 bind(new InetSocketAddress(port)); ListNChannel.configureBlocking(false); //必須是不塊的,以註冊//用渠道註冊選擇器。返回的密鑰被忽略listNChannel.Register(Selector,selectionKey.op_accept); } //創建一個將實現協議tcpprotocol協議=新的tcpechoselectorProtocol(bufSize)的處理程序;而(true){//永遠運行,處理可用的i/o操作//等待某些頻道準備就緒(或超時),如果(selector.select(timeout)== 0){//返回ready chans system.out.ut.print(“。”);繼續; } //用I/O在鍵上獲取迭代器以處理iTerator <SelectionKey> keyiter = selector.selectedkeys()。 iterator(); while(keyiter.hasnext()){selectionkey key = keyiter.next(); //鍵是bit mask //服務器套接字通道有未決的連接請求嗎? if(key.isacceptable()){system.out.println(“ ----- accept -----”); stolopt.handleaccept(key); } //客戶端套接字通道有待處理的數據? if(key.isradable()){system.out.println(“ ----讀-----”); stolopt.handleread(key); } //客戶端套接字通道可用於編寫,//鍵是有效的(即,頻道未關閉)? if(key.isvalid()&& key.iswritable()){system.out.println(“ -----寫入------”); stolopt.handlewrite(key); } keyiter.remove(); //從一組選定的鍵}}}}中刪除以上就是本文的全部內容,java的語法,大家可以關注:《在Java jdk 1.7 參考手冊官方英文版》、《 jdk 1.6 api java jdk jdk jdk jdk jdk 1.5 api java 中文參考手冊》,也希望大家多多支持武林網。 ,也希望大家多多支持武林網。