当前位置: 移动技术网 > IT编程>开发语言>Java > Java Socket编程实例(五)- NIO UDP实践

Java Socket编程实例(五)- NIO UDP实践

2019年07月22日  | 移动技术网IT编程  | 我要评论

一、回传协议接口和udp方式实现:

1.接口:

import java.nio.channels.selectionkey; 
import java.io.ioexception; 
 
public interface echoprotocol { 
 void handleaccept(selectionkey key) throws ioexception; 
 void handleread(selectionkey key) throws ioexception; 
 void handlewrite(selectionkey key) throws ioexception; 
} 

2.实现:

import java.net.socketaddress; 
import java.nio.channels.*; 
import java.nio.bytebuffer; 
import java.io.ioexception; 
 
public class udpechoselectorprotocol implements <span style="font-size: 1em; line-height: 1.5;">echoprotocol </span><span style="font-size: 1em; line-height: 1.5;">{</span> 
  private static final int echomax = 255; // maximum size of echo datagram 
 
  static class clientrecord { 
    public socketaddress clientaddress; 
    public bytebuffer buffer = bytebuffer.allocate(echomax); 
  } 
 
  public void handleaccept(selectionkey key) throws ioexception { 
     
  } 
 
  public void handleread(selectionkey key) throws ioexception { 
    datagramchannel channel = (datagramchannel) key.channel(); 
    clientrecord clntrec = (clientrecord) key.attachment(); 
    clntrec.buffer.clear(); // prepare buffer for receiving 
    clntrec.clientaddress = channel.receive(clntrec.buffer); 
    if (clntrec.clientaddress != null) { // did we receive something? 
      // register write with the selector 
      key.interestops(selectionkey.op_write); 
    } 
  } 
 
  public void handlewrite(selectionkey key) throws ioexception { 
    datagramchannel channel = (datagramchannel) key.channel(); 
    clientrecord clntrec = (clientrecord) key.attachment(); 
    clntrec.buffer.flip(); // prepare buffer for sending 
    int bytessent = channel.send(clntrec.buffer, clntrec.clientaddress); 
    if (bytessent != 0) { // buffer completely written? 
      // no longer interested in writes 
      key.interestops(selectionkey.op_read); 
    } 
  } 
 
}

二、nio udp客户端:

import java.net.inetsocketaddress; 
import java.net.socketexception; 
import java.nio.bytebuffer; 
import java.nio.channels.datagramchannel; 
 
public class udpechoclientnonblocking { 
 
  private static final int timeout = 3000; // resend timeout (milliseconds) 
  private static final int maxtries = 255; // maximum retransmissions 
   
  public static void main(string args[]) throws exception { 
    // convert input string to bytes using the default charset 
    byte[] bytestosend = "0123456789abcdefghijklmnopqrstuvwxyz".getbytes(); 
 
    // create channel and set to nonblocking 
    datagramchannel datagramchannel = datagramchannel.open(); 
    datagramchannel.configureblocking(false); 
    datagramchannel.socket().setsotimeout(timeout); 
     
    bytebuffer writebuf = bytebuffer.wrap(bytestosend); 
    bytebuffer readbuf = bytebuffer.allocate(maxtries); 
     
    datagramchannel = datagramchannel.connect(new inetsocketaddress("127.0.0.1", 5500)); 
 
    int totalbytesrcvd = 0; // total bytes received so far 
    int bytesrcvd; // bytes received in last read 
    while (totalbytesrcvd < bytestosend.length) { 
      if (writebuf.hasremaining()) { 
        datagramchannel.write(writebuf); 
      } 
      if ((bytesrcvd = datagramchannel.read(readbuf)) == -1) { 
        throw new socketexception("connection closed prematurely"); 
      } 
      totalbytesrcvd += bytesrcvd; 
      system.out.print("."); // do something else 
    } 
 
    system.out.println("received: " + new string(readbuf.array(), 0, totalbytesrcvd)); 
    datagramchannel.close(); 
  } 
}

三、nio udp服务端:

import java.io.ioexception; 
import java.net.inetsocketaddress; 
import java.nio.channels.*; 
import java.util.iterator; 
 
public class udpechoserverselector { 
 
  private static final int timeout = 3000; // wait timeout (milliseconds) 
 
  public static void main(string[] args) throws ioexception { 
    // create a selector to multiplex client connections. 
    selector selector = selector.open(); 
 
    datagramchannel channel = datagramchannel.open(); 
    channel.configureblocking(false); 
    channel.socket().bind(new inetsocketaddress(5500)); 
    channel.register(selector, selectionkey.op_read, new udpechoselectorprotocol.clientrecord()); 
 
    udpechoselectorprotocol echoselectorprotocol = new udpechoselectorprotocol(); 
    while (true) { // run forever, receiving and echoing datagrams 
      // wait for task or until timeout expires 
      if (selector.select(timeout) == 0) { 
        system.out.print("."); 
        continue; 
      } 
 
      // get iterator on set of keys with i/o to process 
      iterator<selectionkey> keyiter = selector.selectedkeys().iterator(); 
      while (keyiter.hasnext()) { 
        selectionkey key = keyiter.next(); // key is bit mask 
 
        // client socket channel has pending data? 
        if (key.isreadable()) 
          echoselectorprotocol.handleread(key); 
 
        // client socket channel is available for writing and 
        // key is valid (i.e., channel not closed). 
        if (key.isvalid() && key.iswritable()) 
          echoselectorprotocol.handlewrite(key); 
 
        keyiter.remove(); 
      } 
    } 
  } 
 
}

以上就是本文的全部内容,查看更多java的语法,大家可以关注:《》、《》、《》、《》,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网