Могу ли я отправить данные через TCP до закрытия Socket? - PullRequest
0 голосов
/ 12 июня 2018

Я лучше объясню свой вопрос и предупредительно извиняюсь за мой плохой английский.Я тренируюсь с пакетом java.net (это аргумент моего следующего университетского экзамена) и пытаюсь лучше контролировать связь между клиентом и устройством сервера.Точнее, я пытался отправить с помощью TCP-соединения 3 разных строки с сервера на клиент за 3 разных раза перед вызовом метода close () для соответствующего Socket.Я узнал, что мой сценарий не работает так, как я предполагал.На стороне клиента я получаю все 3 строки, но только когда закрываю сокет.Вместо этого я хотел бы получить все 3 сообщения сразу после помещения их в поток вывода сервера.Я выложу код серверного скрипта.

Прежде чем критиковать меня, я прочитал этот вопрос, прежде чем писать новый, но он не решил мою проблему. Скрипт нижетело метода run () потока, который управляет моим соединением на стороне сервера.

try{
        //Dormi per un pò..

        System.out.println("Il Client con ip "+ind+" ed associato all' Handler #"+id+" è in attesa");
        Thread.sleep(5000);
        PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
        pw.println("Hi "+ind); //ind is the InetAddress of the connected client
        pw.flush();
        Thread.sleep(5000);
        pw.write("what's up?\n");
        pw.flush();
        Thread.sleep(5000);
        pw.write("I gotta go. Bye\n");
        pw.flush();
        pw.close();
        s.close();
        System.out.println("Il Client associato all'Handler #"+id+" si è disconnesso");
    }catch(Exception e){
        e.printStackTrace();
    }

Вот код клиента:

package socket;


import java.net.*;
import java.io.*;
public class MultiThreadClient extends Thread{

   private byte[] address={(byte) 192, (byte)168, (byte) 1, (byte)15};
   private int destPort=2000;

   public MultiThreadClient(){
       super();
   }

   public void run(){
       try{
           InetAddress ip=InetAddress.getByAddress(address);
           Socket s=new Socket(ip,destPort);
           s.setReuseAddress(true);
           BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 
           String message1=br.readLine();
           String message2=br.readLine();
           String message3=br.readLine();
           System.out.println(message1);
           System.out.println(message2);
           System.out.println(message3);

           s.close();
       }catch(Exception e){
           e.printStackTrace();
       }
  }


  public static void main(String[]args){
  //for(int i=0;i<3;i++){
      MultiThreadClient mtc=new MultiThreadClient();
      mtc.start();
  // }
  }

}

1 Ответ

0 голосов
/ 12 июня 2018

Ваш код работает нормально - вы просто блокируете 3 раза по методу readLine и затем печатаете свои ответы (в это время сокет закрывается на стороне сервера).

попробуйте это:

        String message1 = br.readLine();
        System.out.println(message1);
        String message2 = br.readLine();
        System.out.println(message2);
        String message3 = br.readLine();
        System.out.println(message3);

Еще один совет от меня - выполнить очистку в блоке finally.

try { ... }
catch { ... }
finally {
    s.close();
}

Таким образом, ресурсы очищаются даже при возникновении исключения.

...