一、回传协议接口和 udp 方式实现 :
1. 接口 :
Import Java.nio.Channels.SelectionKey; importieren java.io.ioException; public interface echoprotocol {void Handleaccept (SelectionKey Key) löst IOException aus; void Handlelead (SelectionKey Key) löst IOException aus; void HandleWrite (SelectionKey Key) löst IOException aus; }2. 实现 :
importieren java.net.socketaddress; importieren java.nio.channels.*; Import Java.nio.ByTebuffer; importieren java.io.ioException; öffentliche Klasse udpechoselectorProtocol implementiert <span style = "Schriftgröße: 1EM; Zeilenhöhe: 1,5;"> Echoprotocol </span> <span style = "Schriftgröße: 1EM; Zeilenhöhe: 1,5; // Maximale Größe des Echo -Datagramms statische Klasse ClientRecord {public SocketAddress ClientAddress; public bytebuffer buffer = bytebuffer.alcode (echomax); } public void HandleAccept (SelectionKey -Schlüssel) löst IOException aus {} public void HandleaD (SelectionKey -Schlüssel) löscht IoException {Datagramchannel Channel = (Datagramchannel) key.channel (); ClientRecord clnTrec = (ClientRecord) key.attachment (); Clntrec.Buffer.Clear (); // Puffer für den Empfangen von clntrec.clientaddress = Channel.Receive (clntrec.Buffer) vorbereiten; if (clntrec.clientaddress! = null) {// Haben wir etwas erhalten? // Schreiben Sie mit dem Selektorschlüssel. INTERSTOPS (SelectionKey.op_write); }} public void handleWrite (SelectionKey -Schlüssel) löst IOException {datagramchannel Channel = (datagramchannel) key.channel (); ClientRecord clnTrec = (ClientRecord) key.attachment (); Clntrec.Buffer.flip (); // Puffer für das Senden von int bytessent = Channel.Send (clntrec.Buffer, clntrec.clientaddress) vorbereiten; if (bytessent! = 0) {// Puffer vollständig geschrieben? // nicht mehr an Schreibvorgängen key.interestops (SelectionKey.op_read); }}}二、 nio udp 客户端 :
importieren java.net.inetsocketaddress; importieren java.net.socketException; Import Java.nio.ByTebuffer; Import Java.nio.Channels.Datagramchannel; öffentliche Klasse udpechoclientnonBlocking {private statische endgültige int timeout = 3000; // Timeout (Millisekunden) private statische endgültige int maxtries = 255; // Maximale Wiederholungsmissionen öffentliche statische void main (String args []) löst die Ausnahme aus {// Eingabezeichenfolge in Bytes mit dem Standard -Charset -Byte [] byTestosend = "0123456789abcDefghijklMnopqrstuvwxyz" .getByTes (); // Kanal erstellen und auf nicht blockierende DataGramchannel -DataGramchannel = datagramchannel.open () einstellen; DataGramchannel.ConfigureBlocking (false); DataGramchannel.Socket (). setSotimeOut (Timeout); Bytebuffer writeBuf = bytebuffer.wrap (byTestosend); Bytebuffer readbuf = bytebuffer.alcode (maxtries); datagramchannel = datagramchannel.connect (new inetsocketaddress ("127.0.0.1", 5500)); int TotalByTesrcvd = 0; // Gesamt Bytes, die bisher int Bytesrcvd erhalten wurden; // Bytes in der letzten LEAD empfangen (TotalByTesrcvd <byTestosend.length) {if (writeBuf.hasremaining ()) {datagramchannel.write (writeBuf); } if ((bytesrcvd = datagramchannel.read (readbuf)) == -1) {neue SocketException ("Verbindung vorzeitig geschlossen"); } TotalByTesrcvd += bytesrcvd; System.out.print ("."); // etwas anderes mach} system.out.println ("empfangen:" + neuer String (readbuf.array (), 0, TotalByTesrcvd)); datagramchannel.close (); }}三、 nio udp 服务端 :
importieren java.io.ioException; importieren java.net.inetsocketaddress; importieren java.nio.channels.*; Import Java.util.iterator; öffentliche Klasse uDpechoServerSelector {private statische endgültige int timeout = 3000; // Timeout (Milliseconds) Public static void main (String [] args) löscht IOException {// Erstellen Sie einen Selektor für Multiplex -Client -Verbindungen. Selector selector = selector.open (); DataGramchannel Channel = datagramchannel.open (); Channel.ConfigureBlocking (false); Channel.Socket (). Bind (New Inetsocketaddress (5500)); Channel.register (Selector, SelectionKey.op_read, neuer udpechoSelectorProtocol.clientrecord ()); UDpechoSelectorProtocol echoselectorProtocol = new udpechoSelectorProtocol (); while (true) {// für immer laufen, empfangen und wiederholt Datagramme // Warten Sie auf die Aufgabe oder bis zur Zeitläufe abgelaufen ist. weitermachen; } // Iterator auf Tastensätze mit E/A abrufen, um Iterator <SelectionKey> Keyiter = selector.selectedKeys () zu verarbeiten. Iterator (); while (keyiter.hasnext ()) {SelectionKey Key = Keyiter.Next (); // Schlüssel ist Bitmaske // Client -Socket -Kanal hat anhängige Daten? if (key.isreadable ()) echoselectorProtocol.Handlead (Schlüssel); // Client -Socket -Kanal ist zum Schreiben verfügbar und der Schlüssel ist gültig (dh Kanal nicht geschlossen). if (key.isvalid () && key.iswrible ()) echoselectorProtocol.HandleWrite (Schlüssel); Keyiter.Remove (); }}}}以上就是本文的全部内容 , 查看更多 Java 的语法 , : : 《《Denken in Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。