Die Anleitung zu Java Socket

1- Was ist Socket?

Bei der Seite von Server (server-side):
  • Normalerweise läuft ein Programm Server in einem bestimmten Computer. Das Programm Server hat einen Server Socket. Und die Server Socket wird von einer bestimmten Port (port number) gebindet. Die Server Programs warten bei dem Server Socket der Client darauf und zuhören, eine Verbindungsbedarf durchzuführen.
Bei der Seite von Client (client-side):
  • Die Client kennt den Name vom Computer, auf dem der Server läuft und kennt die Port Number, die der Server zuhört. Um eine Verbindungsanfrage zu tun, versucht Client eine Begegnung mit dem Server auf dem Computer der Server programm und Port. Client definiert selbst mit dem Server um einen lokalen Port zu binden, die während des Verbindungsprozess benutzt wird. Normalerweise wird es von dem Betriebssystem zuwiesen 
Die Darstellung im Überblick
Wenn alles gut geht, akzeptiert das Server Programm die Verbindung von Client. Wenn angenommen, hat der Server einen neuen Socket, der mit dem gleichen lokalen Port gebindet wird. Und sein remote endpoint ist die Addresse und Port von Client. Er erstellte einen neuen Socket, die die neue angenommene Client zu pflegen und hört weiter bei der ServerSocket für die anderen Verbindungsanfrage zu.
 
Bei der Seite von Client: wenn die Verbindung angenommen wird, wird ein Socket erfolgreich erstellt und Client kann die Socket benutzen um mit dem Server Programm zu kontaktieren.
Die Client und Server können durch das Aufschreiben und Lesen von seinem Socket kontaktieren
 
Die Eingabedaten in der Input Stream auf dem Socket der Client wird auf der Input Stream von Socket der Server erhaltet. Und umgekehrt wird die Eingabendaten in der Output Stream auf dem Socket der Server in der Input Stream der Socket bei Client erhaltet.
Definition: 
Ein Socket ist ein Endpoint der Kommunikation von 2 im Netz laufenden Programme. Socket wird mit einem Port gebindet (eine bestimmten Anzahl), damit die TCP Layer die Applikation, zu der die Daten geschickt wird, festlegen kann 

2- Einfaches Beispiel mit Socket

SimpleServerProgram.java
package org.o7planning.tutorial.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServerProgram {

   public static void main(String args[]) {

       ServerSocket listener = null;
       String line;
       BufferedReader is;
       BufferedWriter os;
       Socket socketOfServer = null;

       // Try to open a server socket on port 9999
       // Note that we can't choose a port less than 1023 if we are not
       // privileged users (root)

 
       try {
           listener = new ServerSocket(9999);
       } catch (IOException e) {
           System.out.println(e);
           System.exit(1);
       }

       try {
           System.out.println("Server is waiting to accept user...");

           // Accept client connection request
           // Get new Socket at Server.    
           socketOfServer = listener.accept();
           System.out.println("Accept a client!");

           // Open input and output streams
           is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
           os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));


           while (true) {
               // Read data to the server (sent from client).
               line = is.readLine();
               
               // Write to socket of Server
               // (Send to client)
               os.write(">> " + line);
               // End of line
               os.newLine();
               // Flush data.
               os.flush();  


               // If users send QUIT (To end conversation).
               if (line.equals("QUIT")) {
                   os.write(">> OK");
                   os.newLine();
                   os.flush();
                   break;
               }
           }

       } catch (IOException e) {
           System.out.println(e);
           e.printStackTrace();
       }
       System.out.println("Sever stopped!");
   }
}
SimpleClientDemo.java
package org.o7planning.tutorial.socket;

import java.io.*;
import java.net.*;

public class SimpleClientDemo {

   public static void main(String[] args) {

       // Server Host
       final String serverHost = "localhost";

       Socket socketOfClient = null;
       BufferedWriter os = null;
       BufferedReader is = null;

       try {
           
           // Send a request to connect to the server is listening
           // on machine 'localhost' port 9999.
           socketOfClient = new Socket(serverHost, 9999);

           // Create output stream at the client (to send data to the server)
           os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));


           // Input stream at Client (Receive data from the server).
           is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));

       } catch (UnknownHostException e) {
           System.err.println("Don't know about host " + serverHost);
           return;
       } catch (IOException e) {
           System.err.println("Couldn't get I/O for the connection to " + serverHost);
           return;
       }

       try {

           // Write data to the output stream of the Client Socket.
           os.write("HELO");
 
           // End of line
           os.newLine();
   
           // Flush data.
           os.flush();  
           os.write("I am Tom Cat");
           os.newLine();
           os.flush();
           os.write("QUIT");
           os.newLine();
           os.flush();


           
           // Read data sent from the server.
           // By reading the input stream of the Client Socket.
           String responseLine;
           while ((responseLine = is.readLine()) != null) {
               System.out.println("Server: " + responseLine);
               if (responseLine.indexOf("OK") != -1) {
                   break;
               }
           }

           os.close();
           is.close();
           socketOfClient.close();
       } catch (UnknownHostException e) {
           System.err.println("Trying to connect to unknown host: " + e);
       } catch (IOException e) {
           System.err.println("IOException:  " + e);
       }
   }

}
Das Beispiel
Zuerst brauchen Sie die Class SimpleServerProgram: zu starten
Nächste starten Sie die class  SimpleClientDemo.

3- Das Beispiel von Socket + Thread

Normalerweise wird eine Verbindung zwischen Server und 1 Client erstellt. Sie sollen sie miteinander in einem Thread kommunizieren lassen, so jede wenn es eine neue Verbindung gibt, wird ein neuer Thread erstellt
ServerProgram.java
package org.o7planning.tutorial.socketthread;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerProgram {

   public static void main(String args[]) throws IOException {

       ServerSocket listener = null;

       System.out.println("Server is waiting to accept user...");
       int clientNumber = 0;

       // Try to open a server socket on port 7777
       // Note that we can't choose a port less than 1023 if we are not
       // privileged users (root)

       try {
           listener = new ServerSocket(7777);
       } catch (IOException e) {
           System.out.println(e);
           System.exit(1);
       }

       try {
           while (true) {
               // Accept client connection request
               // Get new Socket at Server.

               Socket socketOfServer = listener.accept();
               new ServiceThread(socketOfServer, clientNumber++).start();
           }
       } finally {
           listener.close();
       }

   }

   private static void log(String message) {
       System.out.println(message);
   }

   private static class ServiceThread extends Thread {

       private int clientNumber;
       private Socket socketOfServer;

       public ServiceThread(Socket socketOfServer, int clientNumber) {
           this.clientNumber = clientNumber;
           this.socketOfServer = socketOfServer;

           // Log
           log("New connection with client# " + this.clientNumber + " at " + socketOfServer);
       }

       @Override
       public void run() {

           try {

               // Open input and output streams
               BufferedReader is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
               BufferedWriter os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));

               while (true) {
                   // Read data to the server (sent from client).
                   String line = is.readLine();
                   
                   // Write to socket of Server
                   // (Send to client)                    
                   os.write(">> " + line);
                   // End of line.
                   os.newLine();
                   // Flush data.
                   os.flush();

           
                   // If users send QUIT (To end conversation).
                   if (line.equals("QUIT")) {
                       os.write(">> OK");
                       os.newLine();
                       os.flush();
                       break;
                   }
               }

           } catch (IOException e) {
               System.out.println(e);
               e.printStackTrace();
           }
       }
   }
}
ClientDemo.java
package org.o7planning.tutorial.socketthread;

import java.io.*;
import java.net.*;
import java.util.Date;

public class ClientDemo {

   public static void main(String[] args) {

 
       final String serverHost = "localhost";

       Socket socketOfClient = null;
       BufferedWriter os = null;
       BufferedReader is = null;

       try {
     
           
           // Send a request to connect to the server is listening
           // on machine 'localhost' port 7777.            
           socketOfClient = new Socket(serverHost, 7777);
     
           // Create output stream at the client (to send data to the server)
           os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));

     
           // Input stream at Client (Receive data from the server).
           is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));

       } catch (UnknownHostException e) {
           System.err.println("Don't know about host " + serverHost);
           return;
       } catch (IOException e) {
           System.err.println("Couldn't get I/O for the connection to " + serverHost);
           return;
       }

       try {
   
           // Write data to the output stream of the Client Socket.
           os.write("HELO! now is " + new Date());
       
           // End of line
           os.newLine();
       
           // Flush data.
           os.flush();  
           os.write("I am Tom Cat");
           os.newLine();
           os.flush();
           os.write("QUIT");  
           os.newLine();
           os.flush();

     
           
           // Read data sent from the server.
           // By reading the input stream of the Client Socket.
           String responseLine;
           while ((responseLine = is.readLine()) != null) {
               System.out.println("Server: " + responseLine);
               if (responseLine.indexOf("OK") != -1) {
                   break;
               }
           }

           os.close();
           is.close();
           socketOfClient.close();
       } catch (UnknownHostException e) {
           System.err.println("Trying to connect to unknown host: " + e);
       } catch (IOException e) {
           System.err.println("IOException:  " + e);
       }
   }

}