Server TCP problem

0

Mam problem z komunikacją pomiędzy serwerem a klientem.
Program na razie powinien:
Wysłać wiadomość start przy połączeniu (działa)
Oczekiwać na wiadomość od klienta i po jej otrzymaniu wysłać ją z powrotem (tutaj jest problem)

wszystko wyświetlam w swingu

po wpisaniu wiadomości i naciśnięciu guzika send (wpisuje do PrintWriter(clientSocket.getOutputStream(), true) wiadomość którą użytkownik wpisał w textfieldzie) nic się nie dzieje
jednakże jeśli debuguje program linia po linijce ... wszystko działa jak powinno i wysyła z powrotem do klienta to co wysłał. O co chodzi ? jak to jest możliwe? I jak to naprawić?

Server:

package server.model;

import java.net.*;
import java.io.*;

public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(1111);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 1111.");
            System.exit(1);
        }

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
				new InputStreamReader(
				clientSocket.getInputStream()));
        String inputLine, outputLine;
        outputLine = "Start";       //wiadomosc start
        out.println(outputLine);   //i jej wyslanie do klienta

        while ((inputLine = in.readLine()) != null) { //czeka na wiadomosc
             out.println(inputLine); 
             if (inputLine.equals("Bye."))
                break;
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
} 

Klient

 package server.widok;
import persons.view.View;
import persons.view.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;

public class Client {

    static String fromUser;
    static Window window;

    public static void main(String[] args) throws IOException {
        window = new Window();
        Socket kkSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        boolean listening;

        try {
            kkSocket = new Socket("localhost", 1111);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis.");
            System.exit(1);
        }

        String fromServer;
        
        window.sendButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) { //wyslanie wiadomosci
                fromUser = window.textField.getText();    //kasowanie textfielda 
                window.textField.setText("");     //i focus na niego z powrotem
                window.textField.requestFocus();
            }
        });
        boolean list = true;
        while(list)      //petla glowna 
        if(in.ready()) //jesli jest cos w in to przechodi dalej
        while ((fromServer = in.readLine()) != null) {
            window.textArea.append("Server: " + fromServer + "\n");
            if (fromServer.equals("Bye.")) {
                break;
            }
            listening = true;
            while (listening) {
                if (fromUser != null) {
                    window.textArea.append("Client: " + fromUser + "\n");
                    out.println(fromUser);
                    listening = false;
                    fromUser = null;
                }
            }
        }

        out.close();
        in.close();
        kkSocket.close();
    }
}

Widok w swingu:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persons.view;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 *
 * @author Piotrek
 */
public class Window {
    public JFrame frame;
    public JButton sendButton;
    public JTextArea textArea;
    public JTextField textField;
    public Window(){
        JFrame.setDefaultLookAndFeelDecorated(true);
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new BorderLayout());
        JPanel send = new JPanel();
        textField = new JTextField(10);
        sendButton = new JButton("Send");
        send.add(textField);
        send.add(sendButton);
        textArea = new JTextArea(10,10);
        panel.add(textArea,BorderLayout.CENTER);
        panel.add(send,BorderLayout.SOUTH);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
0

bardzo proszę o pomoc nie mam pojęcia gdzie nawet szukać błędu gdy przy debugowaniu jest w porządku wszystko :/

0

Wyjątki są po to by je obsłużyć, a nie ignorować.

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

Twoje programy działają dobrze w dwóch przypadkach:

  • serwer nie pracuje, uruchamiamy klienta: pojawia się komunikat o trudnościach z połączeniem i klient kończy pracę,
  • serwer pracuje, uruchamiamy klienta.
    Program działa źle przy takiej sekwencji:
  • uruchamiamy serwer,
  • uruchamiamy klienta,
  • zamykamy serwer.
    Klient wysyła coś do niedziałającego serwera, generowany wyjątek ignorujesz więc nic o nim nie wiesz. Jeśli nawet serwer ruszy, to kliknięcie w przycisk Send nie nawiązuje ponownie połączenie, zatem program nadal działa źle.
0

Tak oczywiście sie z tobą zgadzam, nie wyjaśnia to jednak czemu program działa podczas debugowania, a nie działa bez niego. Tu i tu robie to samo:
bez debugowania:
start serwera
start klienta
wpisuje wiadomosc
guzik send
nic sie nie dzieje nie działa

z debugowaniem uruchamian serwer zeby doszedl do momentu odbierania wiadomosci od klienta -> zanim dojdzie do tego punktu czeka na połączenie
usuramian klienta
serwer zatrzymuje się przy w/w lini kodu
wpisuje wartosc w kliencie
naciskam guzik
nastepnie klawiszem f8 przechodze do nastepnych lini kodu w serwerze
serwer odbiera wiadomosc i wysyła ją z powrotem
na oknie pojawia sie komunikat zwrotny
i wszystko dziala

0

Nie ignoruj wyjątków, to się dowiesz co się nie udało. Na moich komputerach (XP i 7) program działa. Aczkolwiek serwer inaczej reaguje na brutalne zamknięcie klienta. Na XP serwer kulturalnie kończy pracę, na 7 wpierw jest SocketException w wierszu 31, a dopiero potem koniec pracy serwera.

0

Ja mowie jedno ty drogie ...

Ty omawiasz problem zamknięcia klienta podczas pracy serwera
a ja mowie o tym ze serwer z klientem się nie komunikuje :/ (podczas pracy obydwu!! bez wyłączania czegokolwiek nie wiem czemu za każdym razem do tego wracasz, pierw chce, żeby w ogóle się komunikowały potem zajmę się zamykaniem jednego podczas pracy drugiego.)

wiem przecież ze program nie będzie działać jeśli wyłączę serwer ...

Ja pytam tylko o to czemu program działa podczas uruchamiania linii po linii, a nie działa przy uruchamianiu normalnym.

0

Umiesz czytać?

Na moich komputerach (XP i 7) program działa.

U mnie systemy różnią się tylko reakcją na brutalne zamknięcie klienta.
Dodaj do programu obsługę błędów, wywal

throw IOException

po metodach main.

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