2017-01-18 3 views
-1

Это заявление о постановке задачи:Сервер и клиент Чаттера

Разработка протокола, в котором сервер отвечает за соответствие двум чат-клиентам. Сервер прослушивает TCP-порт для предстоящих подключений. Если клиент не подключен к соединенному серверу, сервер принимает подключаемый клиент и заставляет его ждать другого клиента. Для этого он отправляет сообщение подключающему клиенту для ожидания. При получении этой команды клиент создает другой экземпляр сервера Socket для прослушивания на порту. Затем клиент отправляет mesagge на сервер, который содержит номер порта, в котором слушает вновь созданный сервер. Когда другой клиент, C2, ищет соединение с сервером, пока C1 ожидает, сервер сообщает C2 о существовании C1, отправив сообщение «PEER_LOC $ h: $ p» на C2, где $ h - имя хоста (или IP-адрес) адрес) C1 и $ p - номер порта, на котором оживает C1. После того, как C2 получает это сообщение, он ищет соединение с C1, используя полученную информацию. Клиенты получают сообщения от пользователей. Затем оба клиента обмениваются сообщениями, пока ни одна из сторон не отправит конец потока »(Ctrl-D в Linux). Их сохранение затем прекращается. Сложные методы могут использовать несколько потоков, тайм-аутов и т. Д., И в этой задаче не требуется.

Мои проблемы связаны с подключением двух клиентов к моему серверу. Я запускаю свою серверную программу, а затем два других класса клиентов, которые дублируются друг другом только с разными именами. Я могу подключиться к одному из них, только другой, кажется, ждет навсегда.

Тезисы - мои занятия, которыми я управляю.

Сервер:

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) { 

      } 

     } 

    } 
} 

и один продублированные классы клиента C1 или 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(); 
    } 

} 

Я могу подключиться к первому клиенту я запускаю второй клиент ожидает когда-либо. Любые предложения или комментарии будут оценены.

+0

Вы принимаете 'не в любом виде цикла, так как он может принимать более одного клиентского соединения? –

+0

О, я вижу, у вас есть код в двух местах, который «принимает» –

+0

Это не так. когда я звоню, когда я вызываю метод во время соединения? – user7338821

ответ

1

Ваш обработчик (который должен реализовывать Runnable, а не продолжение Thread) должен быть создан и запускаться в своем фоновом потоке каждый раз, когда сервер делает соединение, так что весь код блокировки идет туда и не мешает серверу делая следующее соединение. Я даже не знаю, почему у вас есть первый цикл while (true), так как он ничего не полезен. Весь важный код находится во втором, а true - в runServer(), и именно здесь должен быть создан ваш обработчик.

+0

поэтому я должен создать экземпляр обработчика в методе whileConnected i.e, где я делаю server.accept (порт)? – user7338821

+0

Обычно я получаю объект Socket, полученный от accept, и передаю его в конструктор обработчика, а затем запускаю обработчик в потоке. 'new Thread (новый MyHandler (myAcceptedSocket)). start();' –

+0

@ user7338821: также обратите внимание, что вам нужен только один класс Client. Да, вам нужны два экземпляра этого класса, но нужен только один класс. –

Смежные вопросы