一、回传协议接口和 TCP 方式实现 :
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.nio.channels.*; Import Java.nio.ByTebuffer; importieren java.io.ioException; public class tcpechoSelectorProtocol implementiert Echoprotocol {private int bufsize; // Größe des E/A -Puffer public echoselectorProtocol (int bufsize) {this.bufsize = bufsize; } public void Handleaccept (SelectionKey -Schlüssel) löst IOException {Socketchannel clntchan = ((ServerSocketchannel) key.channel ()). Accept (); clntchan.configureBlocking (falsch); // muss nicht blockiert sein, um den Selektor mit neuem Kanal zu registrieren, um Byte -Buffer clntchan.register (key.selector (), selectionKey.op_read, bytebuffer.alcode (bufsize))); } public void HandleaD (SelectionKey Key) löst IOException aus {// Client -Socket -Kanal hat anhängige Daten Socketchannel clntchan = (socketchannel) key.channel (); Bytebuffer buf = (bytebuffer) key.attachment (); long byteSread = clntchan.read (buf); if (byteSread == -1) {// Hat das andere Ende geschlossen? clntchan.close (); } else if (byteSread> 0) {// Geben Sie über Schlüssel an, dass Lesen/Schreiben jetzt beide von Interesse sind. key.interestops (selectionKey.op_read | selectionKey.op_write); }} public void handleWrite (SelectionKey -Schlüssel) löst IOException aus. */ // Daten abrufen buf.flip (); // Puffer für das Schreiben von Socketchannel clntchan = (Socketchannel) key.channel () vorbereiten; clntchan.write (buf); if (! buf.hasremaining ()) {// Puffer vollständig geschrieben? // Nichts übrig, also nicht mehr an Schreibvorgängen key.interestops (SelectionKey.op_read); } buf.comPact (); // Machen Sie Platz für weitere Daten in}}二、 nio tcp 客户端 :
importieren java.net.inetsocketaddress; importieren java.net.socketException; Import Java.nio.ByTebuffer; import Java.nio.channels.socketchannel; public class tcpechoclientnonBlocking {public static void main (String args []) löst Ausnahme aus {String Server = "127.0.0.1"; // Servername oder IP -Adresse // Eingabezeichenfolge mithilfe des Standard -Charset -Byte [] argument = "0123456789abcdefghijklMnopQrstuvwxyz" .GetByTes () konvertieren; int servport = 5500; // Kanal erstellen und auf nicht blockierende Socketchannel clntchan = socketchannel.open (); clntchan.configureBlocking (falsch); // Die Verbindung zum Server einleiten und wiederholt befragen, bis abgeschlossen ist, wenn (! Clntchan.connect (New InetSocketaddress (Server, Servport)) {while (! Clntchan.finishConnect ()) {System.out.print ("."); // etwas anderes machen}} bytebuffer writeBuf = bytebuffer.wrap (Argument); Bytebuffer readbuf = bytebuffer.Allecode (argument.length); int TotalByTesrcvd = 0; // Gesamt Bytes, die bisher int Bytesrcvd erhalten wurden; // Bytes in der letzten Read empfangen (TotalByTesrcvd <argument.length) {if (writeBuf.hasremaining ()) {clntchan.write (writeBuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {neue SocketException werfen ("Verbindung vorzeitig geschlossen"); } TotalByTesrcvd += bytesrcvd; System.out.print ("."); // etwas anderes mach} system.out.println ("empfangen:" + // konvertieren in Zeichenfolge pro Standard -Zeichen. clntchan.close (); }}三、 nio tcp 服务端 :
importieren java.io.ioException; importieren java.net.inetsocketaddress; importieren java.nio.channels.*; Import Java.util.iterator; public class tCpServerSelector {private statische endgültige int bufsize = 256; // Puffergröße (Bytes) Private statische endgültige int timeout = 3000; // Timeout (Milliseconds) public static void main (String [] args) löscht ioException {int [] ports = {5500} aus; // Erstellen Sie einen Selector, um Hörhöhlen und Verbindungen Selector Selector = selector.open () zu multiplexen. // Erstellen Sie den Hör -Socket -Kanal für jeden Port- und Register -Selektor für (int port: ports) {serversocketchannel listnchannel = serverSocketchannel.open (); listnChannel.socket (). Bind (New InetSocketaddress (Port)); listnChannel.configureBlocking (falsch); // muss nicht blockieren, um sich zu registrieren // Selektor mit Kanal registrieren. Der zurückgegebene Schlüssel wird ignoriert listnChannel.register (Selector, SelectionKey.op_accept); } // Erstellen Sie einen Handler, der das Protokoll TCPPROTOCOL Protocol = new tcpechoSelectorProtocol (bufSize) implementiert; while (true) {// für immer ausführen, die verfügbaren E/A -Operationen verarbeiten // Warten Sie, bis ein Kanal bereit ist (oder Zeitlimit) if (selector.select (timeout) == 0) {// gibt # von Ready Chans System.out.Out.print ("); 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 // Server -Socket -Kanal hat anhängige Verbindungsanforderungen? if (key.isacceptable ()) {System.out.println ("---- Akzeptieren -----"); Protokoll.HandLeaccept (Schlüssel); } // Client -Socket -Kanal hat anhängige Daten? if (key.isreadable ()) {System.out.println ("---- Read ------"); Protocol.HandLead (Schlüssel); } // Client -Socket -Kanal ist zum Schreiben verfügbar und // Schlüssel ist gültig (dh Kanal nicht geschlossen)? if (key.isvalid () && key.iswrible ()) {System.out.println ("---- Schreiben -----"); Protokoll.HandleWrite (Schlüssel); } Keyiter.remove (); // aus ausgewählten Schlüssel ausgewählten Tasten entfernen}}}}以上就是本文的全部内容 , 查看更多 Java 的语法 , : : 《《Denken in Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。