In diesem Artikel wird der detaillierte Code der Java -Socket -Programmierung erläutert, um einen einfachen Grußdienst als Referenz zu implementieren. Der spezifische Inhalt ist wie folgt
Serverseite:
Implementieren Sie den einfachsten Hallo -Dienst, drucken Sie die Client -IP -Adresse an die Konsole aus, senden Sie eine Zeichenfolge (Hallo, Java -Socket) an einen angeschlossenen Client und schließen Sie die Verbindung mit dem Client. Warten Sie, bis die Verbindungsanfrage des nächsten Kunden ankommt.
Kunde:
Implementieren Sie einen einfachsten Socket, um eine Verbindung zum Hello Server herzustellen, akzeptiert Byte -Daten, die vom Server gesendet werden, und druckt den Inhalt mit der Konsole aus.
Schlüsseltipps:
Da Java eine Menge Eingabe- und Ausgangsstrom -APIs bietet, sind viele Anfänger der Java -Socket -Programmierung ausgesetzt, und weil sie keine Verständnis für die Natur der Netzwerk -Byte -Kommunikation haben, akzeptieren sie die Socket -Byte -Streams von Readline () direkt. Da die sendende Partei jedoch nicht /r /n sendet, können die Daten nicht gelesen werden. Dies ist der häufigste Fehler. Einige andere häufige Fehler sind das Nicht -Initialisieren des Akzeptanzpuffer, was zu verstümmelten Zeichen führt und nicht gemäß der Anzahl der durch Lesen erhaltenen Bytes wieder zusammengesetzt wurde, was zu einer Ausnahme von den empfangenen Daten führt. Der Code zeigt also, was von Byte und Akzeptanz per Byte gesendet wird. Dies ist ein sehr wichtiges Konzept und ein Prinzip bei der Netzwerkprogrammierung. Lassen Sie die Methode für die Eingabestrom -Println () -Methode und die Ausgabe -Stream -Readline () -Methode zur Hölle gehen. Es ist nicht so, dass es nicht einfach zu bedienen ist, aber ich schlage vor, dass Sie es nicht verwenden, da diese Ihr Verständnis und Ihr Verständnis der Essenz der Netzwerkprogrammierung behindern. Außerdem möchte ich eine besondere Anmerkung machen: Manchmal ist Flush () nicht erforderlich, es sei denn, Sie verwenden einen gepufferten Eingangs- und Ausgangsstrom zum Lesen und Schreiben von Bytes.
Serverseitiger Code:
Paket com.gloomyfish.socket.tutorial.two; importieren java.io.dataoutputStream; importieren java.io.ioException; importieren java.net.serversocket; importieren java.net.socket; public class HelloService erweitert Thread {private ServerSocket ServerSocket; public helloService (int port) löscht ioException {serversocket = new ServerSocket (Port); } public void run () {try {while (true) {System.out.println ("Warten auf den Client auf Port" + serverSocket.getLocalport ()); Socket Client = ServerSocket.accept (); // blockiert und auf das Einkommenssocket system.out.println ("nur verbunden mit" + client.getRemotesocketadDress ()); DataOutputStream dos = new DataOutputStream (client.getOutputStream ()); byte [] Hallo = "Hallo, Java Socket" .GetByTes (); dos.write (hello, 0, hello.length); dos.close (); client.close (); }} catch (Ausnahme e) {e.printstacktrace (); }} public static void main (String [] args) {try {helloService service = new HelloService (9999); Service.Start (); } catch (ioException e) {e.printstacktrace (); }}} Der Server hört auf Port 9999 und wartet auf die Verbindung und verwendet Java-Thread, um ein serverseitiges Start zu erreichen.
Der Client -Code ist wie folgt:
Paket com.gloomyfish.socket.tutorial.two; importieren java.io.datainputstream; importieren java.io.ioException; importieren java.net.inetsocketaddress; importieren java.net.socketaddress; importieren java.net.socketaddress; public class helloclient {private int clientNumber; private Socketaddress -Adresse; public helloclient (int clientnum) {clientnum = clientnum; } public void setupclients (String serverhostName, int port) löst IOException aus {address = new InetSocketadDress (ServerHostName, Port); für (int i = 0; i <ClientNumber; i ++) {System.out.println (); System.out.println ("Start Client Nr." + (I + 1)); Socket Socket = neuer Socket (); Socket.Connect (Adresse); DataNputStream BufferedReader = new DataNputStream (Socket.GetInputStream ()); byte [] cbuff = neues byte [256]; char [] charbuff = new char [256]; int size = 0; while ((size = bufferedReader.read (cbuff))> 0) {convertByTETOCHAR (CBUFF, Charbuff, Größe); System.out.println (Charbuff); } bufferedReader.close (); socket.close (); }} private void convertByTETEOCHAR (byte [] cbuff, char [] charBuff, int size) {für (int i = 0; i <charBuff.length; i ++) {if (i <size) {charBuff [i] = (char) cbuff [i]; } else {Charbuff [i] = ''; }}} public static void main (String [] args) {try {helloclient client = new Helloclient (10); Client.SetUpClients ("Localhost", 9999); } catch (ioException e) {e.printstacktrace (); }}} Starten Sie 10 Clients, um eine Verbindung zur Serverseite herzustellen. Nach dem Empfangen der Servergruß schließt der Client die Verbindung.
Sondertipp: Stellen Sie sicher, dass Sie den Puffer -Charbuff initialisieren
Programmauslaufergebnisse:
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.