2016-11-08 1 views
-2

* Kann die obige Frage nicht herausfinden. habe Orakel-Tutorials ausprobiert und merke aber, dass ich es immer noch nicht kann. jede Hilfe würde sehr geschätzt werden.Erweitern Sie den Server-Code, damit der Server mit Clients interagieren kann, die Multithreading verwenden. Die Anzahl der Clients, die mit demselben Server verbunden sind, ist

Das Gewicht Konvertierungsserver auf Tafel (ConversionServerNoConcurrency.java) gegeben kann in sequentieller Weise mit mehreren Kunden, sondern nur interagieren (das heißt, kann eine neue Client-Instanz nur mit dem Server verbinden, nachdem der Server beendet hat zu tun mit dem vorherigen Client). Erweitern/ändern Sie den angegebenen Servercode, sodass der Server mit mehreren Clients parallel (gleichzeitig), mit Multithreading interagieren kann. Die Anzahl der Clients, die gleichzeitig mit demselben Server verbunden sind, sollte nicht eingeschränkt werden.

brauchen wirklich Hilfe mit dem Code als andere weise werde nicht ich in der Lage sein, es zu verwickeln, wenn meine Aufgabe tun

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 
public class ConversionServerNoConcurrency { 
private Socket s; 
private Scanner in; 
private PrintWriter out; 
public static void main(String[] args) throws IOException { 

    ServerSocket server = new ServerSocket(8888); 

    ConversionServerNoConcurrency serverInstance = new   ConversionServerNoConcurrency(); 

    System.out.println("Server running. Waiting for a client to connect..."); 

    while (true) { 

     serverInstance.s = server.accept(); 

     System.out.println("Client connected"); 

     serverInstance.run(); 

     System.out.println("Client disconnected. Waiting for a new client to connect..."); 
    } 
} 
public void run() { 
    try { 
     try { 

      in = new Scanner(s.getInputStream()); 

      out = new PrintWriter(s.getOutputStream()); 

      doService(); 

     } finally { 
      s.close(); 
     } 
    } catch (IOException e) { 
     System.err.println(e); 
    } 
} 
public void doService() throws IOException { 

    while (true) { 

     if (!in.hasNext()) 
      return; 

     String request = in.next(); 

     System.out.println("Request received from client: \'" + request + "\'"); 

     if (!request.equals("QUIT")) // end connection with this client 
      handleConversionRequest(request); 

    } 
} 
public void handleConversionRequest(String request) { 

    String amountStr = in.next(); 

    double amount = Double.valueOf(amountStr); 

    System.out.println("Amount received from client: " + amount); 

    if (request.equals("CONVERT_TO_POUNDS")) { 
     out.println(amount * 2.2d); // send conversion result to client 
     System.out.println("Sent conversion result to client"); 
    } else if (request.equals("CONVERT_TO_KGS")) { 
     out.println(amount/2.2d); 
     System.out.println("Sent conversion result to client"); 
    } else 
     System.err.println("Unknown request!"); 

     out.flush(); 
    } 
} 

 

import java.io.*; 
import java.net.Socket; 
import java.util.Scanner; 


public class ConversionClient { 

    public static void main(String[] args) throws IOException, InterruptedException{ 
     Socket s = new Socket("localhost", 8888); 
     InputStream instream= s.getInputStream(); 
     OutputStream outstream= s.getOutputStream(); 
     Scanner in = new Scanner(instream); 
     PrintWriter out = new PrintWriter(outstream); 
     out.print("CONVERT_TO_KGS 123.45\n"); // we send the 1st request to the server 
     out.flush(); 
     String response = in.nextLine(); 
     System.out.println("Received from server: " + response); 
     Thread.sleep(2000); // delay the next request a bit 
     out.print("CONVERT_TO_POUNDS 56\n"); // 2nd request 
     out.flush(); 
     response = in.nextLine(); 
     System.out.println("Received from server: " + response); 
     Thread.sleep(2000); // delay the next request a bit 
     out.print("CONVERT_TO_POUNDS 836.98\n"); // 3rd request 
     out.flush(); 
     response = in.nextLine(); 
     System.out.println("Received from server: " + response); 
     out.print("QUIT\n"); 
     out.flush(); 
     s.close(); 
    } 

} 
+1

Es gibt Tausende von Beispielen für Multithreaded-Server auch auf dieser Seite. – Kayaman

Antwort

0

Schreiben Concurrent Verbindungsorientierte Server ist ein wichtiges Thema in Informatik/Softwareentwicklung. Selbst wenn Sie nicht wissen, wie Sie programmieren sollen, müssen Sie Folgendes verstehen.

  1. In einem iterativen verbindungsorientierte Server genau wie ConversionServerNoConcurrency Sie haben, wird es nur ein Thread (Hauptthread) erhalten Anschlüsse und Service-Verbindungen haben.
  2. Sie müssen die Verbindung für den Empfang und die Wartung von Verbindungen in zwei verschiedene Threads trennen, wenn Sie gleichzeitige verbindungsorientierte Server entwickeln möchten.
  3. Wenn unten ConversionServerConcurrency angezeigt wird, wird der Verbindungsempfang vom Haupt-Thread ausgeführt und er weist die Verbindungs-Wartung an Threads im Pool execService zu. Es ist wichtig, einen Thread-Pool zu verwenden, um DDoS-Angriffe zu vermeiden. Da es bei einem Thread-Pool ein Maximum gibt, wie viele Threads erzeugt werden können.
  4. Werfen Sie einen Blick auf ConversionServerTask, die jetzt alle Logik zu Service-Verbindungen hat.

    import java.io.*; 
    import java.net.*; 
    import java.util.Scanner; 
    import java.util.concurrent.*; 
    public class ConversionServerConcurrency { 
    
    public static void main(String[] args) throws IOException { 
    
        ServerSocket server = new ServerSocket(8888); 
    
        System.out.println("Server running. Waiting for a client to connect..."); 
    
        ExecutorService execService = Executors.newFixedThreadPool(10); 
    
        while (true) { 
    
         Socket clientSocket = server.accept(); 
    
         execService.submit(new ConversionServerTask(clientSocket)); 
    
         System.out.println("Waiting for a new client to connect..."); 
        } 
    } 
    
    public static class ConversionServerTask implements Runnable { 
        private Socket s; 
        private Scanner in; 
        private PrintWriter out; 
    
        public ConversionServerTask(Socket clientSocket) { 
         this.s = clientSocket; 
        } 
    
    
        public void run() { 
         System.out.println("Client connected"); 
         try { 
          try { 
    
           in = new Scanner(s.getInputStream()); 
    
           out = new PrintWriter(s.getOutputStream()); 
    
           doService(); 
    
          } finally { 
           s.close(); 
          } 
         } catch (IOException e) { 
          System.err.println(e); 
         } finally { 
          System.out.println("Client disconnected"); 
         } 
        } 
        public void doService() throws IOException { 
    
         while (true) { 
    
          if (!in.hasNext()) 
           return; 
    
          String request = in.next(); 
    
          System.out.println("Request received from client: \'" + request + "\'"); 
    
          if (request.equals("QUIT")) {// end connection with this client 
           break; 
          } else { 
           handleConversionRequest(request); 
          } 
    
         } 
        } 
        public void handleConversionRequest(String request) { 
    
         String amountStr = in.next(); 
    
         double amount = Double.valueOf(amountStr); 
    
         System.out.println("Amount received from client: " + amount); 
    
         if (request.equals("CONVERT_TO_POUNDS")) { 
          out.println(amount * 2.2d); // send conversion result to client 
          System.out.println("Sent conversion result to client"); 
         } else if (request.equals("CONVERT_TO_KGS")) { 
          out.println(amount/2.2d); 
          System.out.println("Sent conversion result to client"); 
         } else 
          System.err.println("Unknown request!"); 
    
         out.flush(); 
        } 
    } 
    
    
    } 
    
+0

wenn ich diesen Code ausführen, stürzt es einfach ab ?? @shazin – seanb94

+0

Sie müssen Java Version 1.7+ haben – shazin

Verwandte Themen