2017-01-18 2 views
-1

Dies ist das Problem Statement i gegeben:Chatter Server und Client

Entwerfen Sie ein Protokoll, bei dem ein Server verantwortlich ist, zwei chatt Kunden übereinstimmen. Der Server überwacht einen TCP-Port auf anstehende Verbindungen. Wenn noch kein Client mit dem zu verbindenden Server verbunden ist, akzeptiert der Server den verbindenden Client und wartet auf einen anderen Client. Um dies zu tun, sendet es eine Nachricht an den verbindenden Client, um zu warten. Wenn dieser Befehl empfangen wird, erstellt der Client eine andere Server-Socket-Instanz, die auf einen Port wartet. Der Client sendet dann eine Nachricht an den Server, der die Portnummer enthält, in der der neu erstellte Server lauscht. Wenn ein anderer Client, C2, eine Verbindung mit dem Server sucht, während C1 wartet, informiert der Server C2 über die Existenz von C1, indem er eine Nachricht "PEER_LOC $ h: $ p" an C2 sendet, wobei $ h der Hostname (oder IP) ist Adresse) von C1 und $ p ist die Portnummer, auf der C1 wartet. Nachdem C2 diese Nachricht empfangen hat, sucht es mithilfe der erhaltenen Informationen eine Verbindung zu C1. Clients erhalten die Nachrichten von Benutzern. Die zwei Clients tauschen dann Nachrichten aus, bis eine der Parteien ein Ende des Streams sendet (Strg-D in Linux). Ihre Konservierung wird dann beendet. Verfeinerte Verfahren können mehrere Threads, Timeouts usw. verwenden und sind bei diesem Problem nicht erforderlich.

Meine Probleme verbindet zwei Clients mit meinem Server. Ich führe mein Serverprogramm und dann noch zwei andere Client-Klassen aus, die sich nur mit unterschiedlichen Namen duplizieren. Ich kann mich mit einem von ihnen verbinden, nur der andere scheint einfach ewig zu warten.

Thesen sind meine Klassen, die ich laufe.

Der Server:

package chatserver2; 

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
    // import all the class that you will need for functionailty 

// extends jframe to develop gui's in java 
public class Server { 

    private static ObjectOutputStream output; // stream data out 
    private static ObjectInputStream input; // stream data in 
    private static ServerSocket server; 
    private static Socket connection; // socket means set up connetion between 2 computers 

    private static int n; 

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

     Server obj = new Server(); 
     obj.RunServer(); 

     try { 
      while (true) { 

       Handler obj2 = new Handler(); 

       obj2.start(); 
       System.out.println("Accepted connection from " 
         + connection.getInetAddress() + " at port " 
         + connection.getPort()); 

       n++; 
       System.out.println("Count " + n); 
      } 
     } finally { 
      connection.close(); 
     } 

    } 

    public Server() { 

    } 

// run the server after gui created 
    public void RunServer() { 

     try { 
      server = new ServerSocket(6789); // 1st number is port number where the application is located on the server, 2nd number is the amount of people aloud to connect 
      while (true) { 

       try { 
        waitForConnection(); // wait for a connection between 2 computers 
        setupStreams(); // set up a stream connection between 2 computers to communicate 
        whileChatting(); // send message to each other 
        // connect with someone and have a conversation 
       } catch (EOFException eofException) { 

       } 
      } 
     } catch (IOException ioException) { 

      ioException.printStackTrace(); 
     } 
    } 

//Wait for a connection then display connection information 
    private void waitForConnection() { 

     try { 
      connection = server.accept(); 
     } catch (IOException ioexception) { 

      ioexception.printStackTrace(); 
     } 

    } 
    // stream function to send and recive data 

    private void setupStreams() throws IOException { 

     output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out 
     output.flush(); // move data away from your machine 
     input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in 

    } 

// this code while run during chat conversions 
    private void whileChatting() throws IOException { 

     String message = "WAIT "; 
     sendMessage(message); 

     do { 

      try { 

       message = (String) input.readObject(); // stores input object message in a string variable 

       System.out.println("Message from Client " + message); 
      } catch (ClassNotFoundException classnotfoundException) { 

      } 
     } while (!message.equals("CLIENT - END"));// if user types end program stops 

    } 

    private void closeChat() { 

     try { 

      output.close(); 
      input.close(); 
      connection.close(); 

     } catch (IOException ioexception) { 

      ioexception.printStackTrace(); 
     } 
    } 

// send message to the client 
    private void sendMessage(String message) { 

     try { 

      output.writeObject(message); 
      output.flush(); 

      System.out.println("Message to client " + message); 

     } catch (IOException ioexception) { 

     } 

    } 

    public static class Handler extends Thread { 

     private Socket connection; 

     public Handler() { 

      String message = "WAIT"; 

     } 

     public void run() { 

      System.out.println("Connect" + Server.connection); 
      while (true) { 

       try { 
        waitForConnection(); 
        setupStreams(); 
        whileChatting(); 
       } catch (IOException ex) { 
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
       } 

      } 

     } 

     private void waitForConnection() { 

      System.out.println("server" + server); 
      try { 
       connection = server.accept(); 
      } catch (IOException ioexception) { 

       ioexception.printStackTrace(); 
      } 
      System.out.println("Connection" + connection); 

     } 

     private void setupStreams() throws IOException { 

      output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out 
      output.flush(); // move data away from your machine 
      input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in 

     } 

     private void whileChatting() throws IOException { 

      String message = " You are now connected "; 
      sendMessage(message); 

      do { 

       try { 

        message = (String) input.readObject(); 

       } catch (ClassNotFoundException classnotfoundException) { 

       } 
      } while (!message.equals("CLIENT - END")); 

     } 

     private void closeChat() { 

      try { 

       output.close(); 
       input.close(); 
       connection.close(); 

      } catch (IOException ioexception) { 

       ioexception.printStackTrace(); 
      } 
     } 

     static private void sendMessage(String message) { 

      try { 

       output.writeObject(message); 
       output.flush(); 

      } catch (IOException ioexception) { 

      } 

     } 

    } 
} 

Das und ein dupliziert Client-Klassen C1 oder C2:

package chatserver2; 

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
    // import all the class that you will need for functionailty 

// extends jframe to develop gui's in java 
public class Client1 extends JFrame { 

    private JTextField userInput; // 
    private JTextArea theChatWindow; // 
    private ObjectOutputStream output; // stream data out 
    private ObjectInputStream input; // stream data in 

    private Socket connection; // socket means set up connetion between 2 computers 

//Constructor 
    public Client1() { 

    } 

// run the server after gui created 
    public void RunClient() { 

     try { 
      connection = new Socket("localhost", 6789);// 1st number is port number where the application is located on the server, 2nd number is the amount of people aloud to connect 
      while (true) { 

       try { 
        // wait for a connection between 2 computers 
        setupStreams(); // set up a stream connection between 2 computers to communicate 
        whileChatting(); // send message to each other 
        // connect with someone and have a conversation 
       } catch (EOFException eofException) { 

       } finally { 

        closeChat(); 
       } 
      } 
     } catch (IOException ioException) { 

      ioException.printStackTrace(); 
     } 
    } 

//Wait for a connection then display connection information 
    // stream function to send and recive data 
    private void setupStreams() throws IOException { 

     output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out 
     output.flush(); // move data away from your machine 
     input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in 

    } 

// this code while run during chat conversions 
    private void whileChatting() throws IOException { 

     String message = ""; 

     do { 
      // have conversion while the client does not type end 
      try { 

       message = (String) input.readObject(); // stores input object message in a string variable 
       System.out.println("message " + message); 
       if (message.equals("WAIT")) { 
        ServerSocket server2 = new ServerSocket(5000); 
        System.out.println("Hello"); 
        message = "5000"; 
        sendMessage(message); 

       } 
       System.out.println("From server " + message); 

      } catch (ClassNotFoundException classnotfoundException) { 

      } 
     } while (!message.equals("CLIENT - END"));// if user types end program stops 

    } 

    private void closeChat() { 

     try { 

      output.close(); // close output stream 
      input.close(); // close input stream 
      connection.close(); // close the main socket connection 

     } catch (IOException ioexception) { 

      ioexception.printStackTrace(); 
     } 
    } 

// send message to the client 
    private void sendMessage(String message) { 

     try { 

      output.writeObject(" - " + message); 
      output.flush(); // send all data out 

     } catch (IOException ioexception) { 

      theChatWindow.append("\n ERROR: Message cant send"); 
     } 

    } 

// 
// 
    public static void main(String[] args) { 
     Client1 obj = new Client1(); 
     obj.RunClient(); 
    } 

} 

kann ich mit dem ersten Client-Verbindung i der zweite Client laufen immer wartet. Irgendwelche Vorschläge oder Anmerkungen würden geschätzt.

+0

Sie "akzeptieren" ist in keiner Art von Schleife, also wie kann es mehr als eine Client-Verbindung akzeptieren? –

+0

Oh, ich sehe, Sie haben Code an zwei Stellen, die 'akzeptiert' –

+0

Es ist in einer Weile Schleife ist nicht. wenn ich anrufe während ich die methode anrufe während ich anrufe? – user7338821

Antwort

1

Ihr Handler (der Runnable implementieren, Thread nicht erweitern) sollte in seinem eigenen Hintergrundthread erstellt und ausgeführt werden, jedes Mal, wenn der Server eine Verbindung herstellt, so dass der gesamte Blockiercode dort hineingeht und den Server nicht davon abhält die nächste Verbindung herstellen. Ich weiß nicht einmal, warum Sie diese erste while (true) Schleife haben, da es nichts nützliches tut. Der ganze wichtige Code ist in der 2. Schleife, die echte in runServer(), und das ist, wo Ihr Handler erstellt werden sollte.

+0

also sollte ich eine Instanz von Handler in der Methode whileConnected, d. H. Wo ich server.accept (port) tun? – user7338821

+0

Ich bekomme normalerweise das Socket-Objekt, das von accept erhalten wurde, und übergebe es an den Handler-Konstruktor und führe dann meinen Handler in einem Thread aus. 'neuer Thread (neuer MyHandler (myAcceptedSocket)). start();' –

+0

@ user7338821: Beachten Sie auch, dass Sie nur eine Client-Klasse benötigen. Ja, Sie benötigen zwei Instanzen dieser Klasse, aber nur eine Klasse wird benötigt. –