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 中文参考手册》,也希望大家多多支持武林网。,也希望大家多多支持武林网。