Für Echtzeit-Anwendungen oder Echtzeitspiele kann das HTTP-Protokoll unsere Bedürfnisse oft nicht erfüllen. Socket ist für uns sehr praktisch. Im Folgenden finden Sie Hinweise für diese Studie. Es erklärt hauptsächlich die Aspekte des Ausnahmetyps, des Interaktionsprinzips, des Sockets, der Serversocket und des Multithreading.
Ausnahmeart
Bevor Sie den Inhalt der Socket verstehen, müssen Sie einige Ausnahmetypen verstehen. Die folgenden vier Typen sind alle von IOException geerbt, so viele IOException tauchen direkt danach auf.
UnkownHostException: Hostname oder IP -Fehler
ConnectException: Der Server weigert sich zu verbinden, der Server startet nicht (die Anzahl der Warteschlangen überschreitet, die Verbindung wird abgelehnt)
SockettimeoutException: Verbindungszeitlimit
BindException: Socket -Objekt kann nicht an die formulierte lokale IP -Adresse oder an die formulierte IP -Adresse oder an Port gebunden werden
Interaktionsprozess
Ich denke, das folgende Bild wurde im Detail und eindeutig erklärt.
Buchse
Konstruktor
Socket()Socket(InetAddress address, int port)throws UnknownHostException, IOExceptionSocket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOExceptionSocket(String host, int port)throws UnknownHostException, IOExceptionSocket(String host, int port, InetAddress localAddress, int localPort)throws IoException
Mit Ausnahme der ersten ohne Parameter versuchen andere Konstruktoren, eine Verbindung zum Server herzustellen. Wenn es fehlschlägt, wird ein IoException -Fehler geworfen. Bei Erfolg wird das Socket -Objekt zurückgegeben.
Inetaddress ist eine Klasse, mit der der Host aufgezeichnet wird. Sein statischer GethostByName (String MSG) kann eine Instanz zurückgeben, und seine statische Methode getLocalHost () kann auch die IP -Adresse des aktuellen Hosts erhalten und eine Instanz zurückgeben. Die Parameter des Socket (String Host, int Port, Inetaddress LocalAddress, Int LocalPort) sind die Ziel -IP, der Zielport, die lokale IP und der lokale Port.
Socket -Methode
GetInetaddress (); IP -Adresse des Remote -Servers
GetPort (); Port des Remote -Servers
GetLocalAddress () IP -Adresse des lokalen Clients
GetLocalport () Port des lokalen Kunden
getInputStream (); getInputStream ();
getoutStream (); Ausgangsstrom abrufen
Es ist erwähnenswert, dass unter diesen Methoden die wichtigsten GetInputStream () und GetoutputStream () sind.
Sockelstatus
isclosed (); // ist die Verbindung geschlossen? Wenn geschlossen, kehren Sie wahr zurück; Ansonsten kehren Sie falsch zurück
isconnect (); // true zurückgeben, wenn es verbunden ist; ansonsten false zurückgeben
isbound (); // Wenn die Steckdose an einen lokalen Port gebunden ist, kehren Sie True zurück. Ansonsten kehren Sie falsch zurück
Wenn Sie bestätigen möchten, ob der Status des Sockets in einer Verbindung ist, ist die folgende Erklärung ein guter Weg, um zu beurteilen.
boolean isConnection = socket.isconnected () &&! socket.isclosed (); // Beurteilen Sie, ob es derzeit in Verbindung steht
Semi-geschlossener Sockel
Oft wissen wir nicht, wie lange es dauert, um im erhaltenen Eingangsstrom fertig zu werden. Hier sind einige gemeinsame Methoden:
Serversocket
Konstruktor
ServerSocket () löscht ioExceptionsSocket (int port) aus.
Notiz:
1. Der von dem Portserver angehörte Port; die Warteschlangenlänge der Backlog -Client -Verbindungsanforderung; Der BindadDR -Server bindet die IP
2. Wenn der Port besetzt ist oder keine Erlaubnis hat, bestimmte Ports zu verwenden, wird ein BindException -Fehler geworfen. Beispielsweise erfordern Ports von 1 bis 1023, dass ein Administrator eine Berechtigungsbindung aufweist.
3. Wenn der Port auf 0 eingestellt ist, weist das System ihm automatisch einen Port zu.
4. BindadDR wird verwendet, um den Server -IP zu binden. Warum gibt es eine solche Einstellung? Zum Beispiel haben einige Maschinen mehrere Netzwerkkarten.
5. Sobald das Serversocket an den Höranschluss gebunden ist, kann es nicht geändert werden. ServerSocket () kann andere Parameter einstellen, bevor der Port binden.
Beispiel für Single-Thread-Serversocket
public void Service () {while (true) {Socket Socket = null; try {socket = serversocket.accept (); // eine Verbindung aus der Verbindungswarteschlange nehmen, wenn nicht, auf system.out.println ("Adresse:"+socket.getInetaddress ()+":"+socket.getPort ()) warten; ... // Daten empfangen und senden} catch (ioException e) {e.printstacktrace ();} schließlich {try {if (socket!Multithread -Serversocket
Unnötig zu erwähnen, dass die Vorteile von Multi-Threading Multi-Threading sind, und die meisten Szenarien sind Multi-Threading. Egal, ob es sich um unsere Echtzeitspiele oder IM handelt, die Multi-Threading-Anforderungen sind erforderlich. Sprechen wir über die Implementierungsmethode unten:
Methoden, die Multi-Threading implementieren, erben entweder die Thread-Klasse oder die Runnable-Schnittstelle. Natürlich können auch Threadpools verwendet werden, aber die Essenz der Implementierung ist ähnlich.
Hier ist ein Beispiel:
Der folgende Code ist der Haupt -Thread des Servers. Weisen Sie jedem Kunden einen Worker -Thread zu:
public void Service () {while (true) {Socket Socket = null; try {socket = serversocket.accept (); // Der Haupt -Thread erhält den Client -Verbindungs -Thread -Thread -Thread = neuer Thread (neuer Handler (Socket)). // Thread Workthread.Start () erstellen; // Thread starten} catch (Ausnahme e) {e.printstacktrace (); }}}Natürlich liegt der Fokus hier auf der Implementierung der Handlerklasse. Handler muss die Runnable -Schnittstelle implementieren:
Klasse Handler implementiert Runnable {privater Socket Socket; public Handler (Socket Socket) {this.socket = Socket; } public void run () {try {system.out.println ("Neue Verbindung:"+socket.getInetaddress ()+":"+socket.getport ()); Thread.sleep (10000); } catch (Ausnahme e) {e.printstacktrace ();} endlich {try {system.out.println ("Schließen Sie die Verbindung:"+socket.getInetadDress ()+":"+socket.getPort ()); if (socket! = null) socket.close (); } catch (ioException e) {e.printstacktrace (); }}}} Natürlich gibt es zuerst andere Möglichkeiten zum Multi-Thread, z. B. Threadpools oder Fadenpools, die in JVM eingebaut sind. Ich werde es hier nicht erklären.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.