Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание клиента при повторном соединении / 3 сообщений из 3, страница 1 из 1
09.08.2018, 17:21
    #39685687
Njula
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание клиента при повторном соединении
Доброго времени суток! Такая возникла проблема. Написал связку сервер-клиент, в которой сервер отсылает по запросу клиента (нажатие кнопки) случайные строки из файла. При первом запуске работает отлично. Но если клиент закрыть, а сервер оставить ждать подключений, и снова запустить клиент, то при нажатии на кнопку клиент зависает. Если перезапустить сервер до перезапуска клиента - работает. В чем может быть причина? Спасибо!
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
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();
        }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
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");
        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);
    }
}
...
Рейтинг: 0 / 0
09.08.2018, 17:42
    #39685690
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание клиента при повторном соединении
Научитесь делать дамп всех потоков и будет видно что и где зависло.
...
Рейтинг: 0 / 0
09.08.2018, 18:22
    #39685699
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание клиента при повторном соединении
Njula,

Сколько я работаю с сокетами то accept должен быть внутри цикла
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  while(runn)
                       {
                           // ждём нового подключения, после чего
                           // запускаем обработку клиента
                           // в новый вычислительный поток и
                       

            try {
        Socket s= server.accept();
 ClientConnection cl=new ClientConnection(s);
                cl.start();
 } catch (IOException ioe) {
                // TODO: Add catch code
                ioe.printStackTrace();
            }
                
                
                       }



А у вас

Код: java
1.
2.
3.
4.
income = server.accept();
            while (true) {
а дальше работа
}



Ну и ещё в потоки обернуть надо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание клиента при повторном соединении / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]