powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание клиента при повторном соединении
3 сообщений из 3, страница 1 из 1
Зависание клиента при повторном соединении
    #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
Зависание клиента при повторном соединении
    #39685690
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Научитесь делать дамп всех потоков и будет видно что и где зависло.
...
Рейтинг: 0 / 0
Зависание клиента при повторном соединении
    #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
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание клиента при повторном соединении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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