2015-04-22 4 views
1

У меня есть программа Server-Client, где я отправляю небольшую почту клиенту с помощью JLabel. Когда это сообщение получает от сервера, тот конкретный клиент должен немедленно отправить ответ. Но он не отправляет никаких сообщений. Может кто-нибудь посмотреть на мой код и рассказать мне, где моя ошибка?Сообщение не отправлено на сервер от клиента - Java

// SERVER

void connect_clients() 
    { 
     try { 
      ServerSocket listener = new ServerSocket(7700); 
      jButton1.setText("Server Running!"); 
      jButton1.setEnabled(false); 
       while (true) { 

        socket = listener.accept(); 
        socketList.add(socket); 
        //socketList.add(listener.accept()); 
        BufferedReader ed = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String tmp = ed.readLine(); 
      System.out.print("I Recieved :"+tmp); 

       } 

      } 
     catch(IOException ex) 
     { 
      JOptionPane.showMessageDialog(null,ex); 
     } 
    } 

// КЛИЕНТ

void connect_server() throws IOException 
    { 
     try { 
      // TODO code application logic here 
      String serverAddress = JOptionPane.showInputDialog(
        "Enter IP Address of a machine that is\n" + 
          "running the date service on port 9090:"); 
      s = new Socket(serverAddress, 7700); 

      while(true){ 
      BufferedReader input = 
      new BufferedReader(new InputStreamReader(s.getInputStream())); 
      String answer = input.readLine(); 
      System.out.println(answer); 
       if(answer != null) 
       { 
        PrintStream pr = new PrintStream(s.getOutputStream()); 
        InputStreamReader rd = new InputStreamReader(System.in); 
        BufferedReader ed = new BufferedReader(rd); 
        String temp = ed.readLine(); 
        pr.println(temp); 

        JOptionPane.showMessageDialog(null,"Answer is not null"); //THIS WORKS 
       } 

      } 

      } 
     catch (ConnectException e) { 

      JOptionPane.showMessageDialog(null, e); 
     } 
     catch (SocketException e) { 

      JOptionPane.showMessageDialog(null, e); 
     } 
    } 
+0

Как именно сервер отправляет первое сообщение после принятия соединения? –

+0

Сообщение отправлено клиентам подумал, что щелкнуть по JLabel, который я здесь не показывал @me_digvijay – question

ответ

1

Некоторые моменты, которые вы пропустили в своей реализации:

  • потоки и розетки никогда не закрыты
  • в клиент я не вижу точки бесконечного цикла
  • клиент должен инициализировать связь, отправив сообщение через выходной поток (не пытаться прочитать первый)

Для простого примера шаги должны быть:

  1. Начало разъединить слушать и после того, как установлено соединение для чтения сообщения (вы сделали)
  2. Клиент должен отправить сообщение через выходной поток и закрыть пары и розетку
  3. Отверстия должны закрыть потоки и опору для эста blished соединение

Пример:

//Server 
socket = listener.accept(); 
BufferedReader ed = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
BufferedWriter pr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()); 
String tmp = ed.readLine(); 
System.out.print("I Recieved :"+tmp); 
String msg = "Message received"; 
pr.write(msg,0,msg.length()); 
pr.newLine(); 
ed.close(); 
pr.close(); 
socket.close(); 

//Client 
BufferedWriter pr = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()); 
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
String sendMessage = "Send Message"; 
pr.write(msg,0,msg.length()); 
pr.newLine(); 
String answer = input.readLine(); 
System.out.println(answer); 
JOptionPane.showMessageDialog(null,"Answer is not null"); 
input.close(); 
pr.close(); 
s.close(); 

ОБНОВЛЕНИЕ

чтения из входного потока непрерывно:

BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
String line; 
while((line=input.readLine())!=null){ 
    //do something with line 
} 
+0

1.Stream и сокеты не закрыты, потому что если я закрою выполнение программы, и тогда я больше не могу отправлять сообщения. 2. Чтобы получать сообщение с сервера, я продолжаю цикл while, иначе программа завершается, как только он получает первое сообщение. 3. Я прочитал сообщение с сервера. Вся идея заключается в том, чтобы отправить небольшое сообщение клиентам с сервера, чтобы он отправил файл, как будто запросил файл у клиента, отправив сообщение. @Stephan – question

+0

1. Я получаю снимок, но в тот же момент вам нужно закрыть их 2. Вам не нужен бесконечный цикл для приема сообщений, вам нужен только цикл, который читается из потока до конца (декларация ввода читатель должен находиться вне цикла) – Stephan

+0

1.я смогу отправить сообщение, если они будут закрыты? 2. Я этого не понимаю? Как реализовать цикл только для чтения из потоков? – question

0

я предложить простой подход, при котором сервер посылает привет Сообщ к клиенту.

Для сервера:

//Server 
ServerSocket ss=new ServerSocket(3554); 
socket = ss.accept(); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getOutputStream())); 
String msg ="Hi from server" 
bw.write(msg); 
String msgFromClient=br.readLine(); 
System.out.println(msgFromClient); 
bw.close(); 
socket.close(); 

Для клиентов:

//Client 
Socket socket=new Socket("localhost",3554) 
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
String received = input.readLine(); 
System.out.println(received); 
bw.write("Client recieve :"+received); 
br.close(); 
bw.close(); 
socket.close(); 
+0

Я могу отправлять сообщения с сервера на клиентов. Моя проблема в том, что я не могу отправить назад сообщение с клиента на сервер. – question

+0

Вы можете проверить сейчас – varpekv

+0

для непрерывной отправки и получения, у вас может быть цикл для этого. – varpekv

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