Wysyłanie wiadomości dopiero po zamknięciu socketu

0

Witam.
Od wczoraj męczę się z tym problemem, i mimo przejrzenia wielu tematów na różnych forach nie znalazłem odpowiedzi.
Program ma proste zadanie. Obiekt klasy Client powinien wysłać jedną wiadomość do serwera, a ten ją wyświetlić.
Mój problem polega na tym, że wiadomość (String) zostaje wysłana dopiero w chwili zamknięcia socketu clienta.
Obie zaprezentowane klasy są wewnętrzne, więc mogą znaleźć się w nich drobne odniesienia do zewnętrznych elementów GUI.

Tworzenie obiektu wygląda mniej więcej tak:

Client c = new Client();
                    
c.sendM();
c.closeAll(); <--jesli to zakomentuję, wiadomość się nie wysyła

Klasa server:

private class Server
    {
        public Server() throws IOException
        {
            try
            {
            
            serverSocket = new ServerSocket(2001);
            }
            
            catch (IOException e)
            {
                System.out.println("Blad tworzenia serwera" + e);
            }
            
            try
            {
                clientSocket = serverSocket.accept();
            }
            
            catch (IOException e)
            {
                System.out.println("Blad accept()" + e);
            }
            System.out.println("Polaczono");
            
            out = new PrintWriter(clientSocket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            
            String line;   
            
            while ((line = in.readLine()) != null)
            {
                text.append(line);
            }
        }
        
               
        public void closeAll() throws IOException
        {
            out.close();
            in.close();
            clientSocket.close();
            serverSocket.close();
        }       
    
       private ServerSocket serverSocket;
       private Socket clientSocket;
       
       PrintWriter out;
       BufferedReader in;
    }

Klasa client:

private class Client
    {
        public Client() throws UnknownHostException, IOException
        {
            try
            {            
                socket = new Socket("localhost",2001);
            }
            
            catch (IOException e)
            {
                System.out.println("Blad socketu" + e);
                return;
            }
            
            
            out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
        }
        
        public void sendM()
        {
            String m = "Hello";
            
            out.println(m);     
            out.flush();
            
            
        }
        
        public void closeAll() throws IOException
        {
            out.close();
            in.close();
            socket.close();
           
        }
        
        private Socket socket;
        private PrintWriter out;
        private BufferedReader in;
    }

Co już próbowałem:

  1. c.socket.setTcpNoDelay(true);
  2. zamiast PrintWriter to BufferedWriter
  3. Dodawanie w różnej kolejności do wiadomości "\n \r \r\n \n\n" itp

Będę bardzo wdzięczny za pomoc.

2

Po czym poznałeś, że wiadomość jest wysyłana dopiero po zamknięciu socketu? Połączyłem Twojego klienta ze swoim serwerem i wiadomość została wysłana od razu. Jeżeli socket serwera pracuje w tym samym wątku co Swing, to pole tekstowe się nie odświeża.

1 użytkowników online, w tym zalogowanych: 0, gości: 1