Зависание клиента при повторном запуске

 
 
 
Сообщения:22
Доброго времени суток! Такая возникла проблема. Написал связку сервер-клиент, в которой сервер отсылает по запросу клиента (нажатие кнопки) случайные строки из файла. При первом запуске работает отлично. Но если клиент закрыть, а сервер оставить ждать подключений, и снова запустить клиент, то при нажатии на кнопку клиент зависает. Если перезапустить сервер до перезапуска клиента - работает. В чем может быть причина? Спасибо!
public class Server {
        ServerSocket server;
        Socket income;
        PrintWriter out;
        Scanner in;
        RandomAccessFile raf;
        private String file;
        private int count;

        public void startServer() throws IOException {
            server = new ServerSocket(1234);
            System.out.println("Ждем подключения...");
            income = server.accept();
            while (true) {
                out = new PrintWriter(income.getOutputStream());
                out.println(getAphorism());
                out.flush();
            }
        }
        private String getAphorism() throws IOException {
            file = "aphorism.txt";
            Random rand = new Random();
            raf = new RandomAccessFile(file,"r");
            String line="";
            while ((raf.readLine())!=null)
                count++;
            int randomPos = rand.nextInt(count-1);
            int i=0;
            raf.seek(0);
            while (i!=randomPos+1)
            {
                line = raf.readLine();
                i++;
            }
            count = 0;
            return line;
        }

        public static void main(String[] args) throws IOException {
            Server server = new Server();
            server.startServer();
        }
}

public class Client extends Application {
    Socket socket;
    Scanner in;
    PrintWriter out;
    String text;
    Stage window;
    Scene scene;
    Group pane;
    Label aphorism;
    Button button;
    VBox layout;
    BorderPane borderPane;

    @Override
    public void start(Stage primaryStage) throws Exception {
        borderPane = new BorderPane();
        socket = new Socket("localhost",1234);
        in = new Scanner(socket.getInputStream(),"UTF-8");
        //while (in.hasNext())
        out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()));
        window = primaryStage;
        pane = new Group();
        layout = new VBox(20);
        layout.setAlignment(Pos.CENTER);
        aphorism = new Label();
        button = new Button("Click me");
        button.setOnAction(event ->{
            aphorism.setText(in.nextLine());
            aphorism.requestLayout();
        });
        layout.getChildren().addAll(aphorism, button);
        pane.getChildren().addAll(layout);
        borderPane.setCenter(pane);
        scene = new Scene(borderPane, 700,200);
        window.setScene(scene);
        window.setTitle("Get Aphorism");
        window.show();
        window.setOnCloseRequest(e->{
                out.close();
                in.close();
                    try {
                        socket.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
        );
    }

    public static void main(String[] args) throws IOException {
        launch(args);
    }
}
 
 
Сообщения:22
Сделал все тоже самое, но только с многопоточным сервером и... клиент перестал зависать! Все работает!
 
 
Сообщения:697
income = server.accept(); надо обернуть в while(true), а обработку выкинуть в отдельный поток.
 
 
Сообщения:697
короче, твой сервер получает запрос и начинает его обрабатывать. до выхода из методы он не доходит и поэтому сокет остаётся открытым. при повторном подключении сокет открыт, но сервер не ждёт новых подключений и поэтому твой клиент не может до него достучаться и поэтому не виснет, а ждёт ответа.
 
 
Сообщения:22
Понятно! Спасибо за разъяснение!
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет