Сообщение от сервера не доходит до клиента

Я хотел бы, чтобы, когда сервер получает сообщение от клиента, и сообщение, например, «start», сервер отправляет обратно IP-адреса и порты остальных клиентов.

Часть сервера:

    ...
    for (i = 0; i < max_clients; i++) {
        sd = client_socket[i]; 

        memset(buffer, 0, 10000);
        if (FD_ISSET( sd , &readfds)) {
            if ((valread = read( sd , buffer, 1024)) == 0) {
                getpeername(sd, (struct sockaddr*)&address, (socklen_t*)&addrlen); 
                printf("Host disconnected , ip %s , port %d \n" , 
                    inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); 



                close( sd ); 
                client_socket[i] = 0; 
            } 
            else {
                char cmd[10] = "";
                int k;
                for(k=0; k<strlen(buffer)-1; k++) {
                    char tmp[2] = "";
                    tmp[0] = buffer[k];
                    strcat(cmd, tmp);
                }
                if (strcmp(cmd, "start") == 0) {
                    char clientInfo[1000] = "[ ";
                    for(j=0; j<max_clients; j++) {
                        if (client_socket[j] > 0 && client_socket[j] != sd) {
                            char port[12];
                            sprintf(port, "%d", clients[j].port);
                            strcat(clientInfo, "{");
                            strcat(clientInfo, clients[j].addr);
                            strcat(clientInfo, " - ");
                            strcat(clientInfo, port);
                            strcat(clientInfo, "} ");                               
                        }

                    }

                    strcat(clientInfo, "]");
                    send(sd, clientInfo, strlen(clientInfo), 0);
                    printf("%s\n", clientInfo);

                } else {
                    buffer[valread] = '\0'; 
                    for(j=0; j<max_clients; j++) {
                        int outSock = client_socket[j];
                        if (outSock != master_socket && outSock != sd) {
                            send(outSock , buffer , strlen(buffer) , 0 ); 
                        }
                    }

                }

            } 
        } 
    } 
    ...

Часть клиента:

public ChatWindowController() {

    try {
        clientSocket = new Socket("127.0.0.1", 54000);
        outToServer = new DataOutputStream(clientSocket.getOutputStream());
        inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        out = new PrintWriter(clientSocket.getOutputStream(), true);

        thread = new Thread() {
            @Override
            public void run() {
                try {

                    while(isRunning) {
                        if (ta_display != null) {
                            String message = inFromServer.readLine();
                            System.out.println(message);
                            ta_display.appendText(message + '\n');
                        }

                    }

                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        };

        thread.start();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
...

...
@FXML
void sendMsg(ActionEvent event) {
    String message = tf_user_input.getText();
    if (username == null || username.equals("") || username.trim().equals("")) {
        ta_display.appendText("You can not send a message, set your username!\n");
        return;
    }

    if (message != null && !message.equals("") && !message.trim().equals("")) {
        try {
            out.println(username + ": " +message);
            out.flush();
        } catch(Exception e) {
            e.printStackTrace();
        }
        ta_display.appendText(username + ": " + message + "\n");
    }
    tf_user_input.setText("");
}

@FXML
void sendFile(ActionEvent event) {
    FileChooser fileChooser = new FileChooser();
    File file = fileChooser.showOpenDialog(null);

    out.println("start");
    out.flush();

}

Сообщения от клиентов отправляются на сервер, а сервер отправляет их другим клиентам, это работает. Но когда клиент отправляет сообщение "start" на сервер, я хочу отправить обратно IP-адреса и порты остальных клиентов, но оно не приходит обратно клиенту, только когда один из других клиентов что-то пишет, сообщение с приходит ip и пользовательские порты.

Например. "[{127.0.0.1 - 1234} {127.0.0.1}] Пользователь: пример"

Как будто сообщение было потеряно и пришло с другим. Я распечатываю IP-адреса и порты, чтобы убедиться, что все в порядке, и все ли печатается правильно.

Я не получаю ошибок.

Кто-нибудь знает, как отправить сообщение после определенного сообщения от клиента?

strcat(clientInfo, "]"); отсутствует \n. На стороне клиента вы ждете ввода с readLine, поэтому вам нужен \ n. - Кстати, это плохая идея. Лучше реализовать какой-нибудь приличный протокол.
Fildor 08.01.2019 16:41

У вас неопределенное поведение for(k=0; k<strlen(buffer)-1; k++){tmp[0] = buffer[k]; strcat(cmd, tmp);}, если strlen(buffer)-1 больше, чем 10 (char cmd[10] = "";).

kiran Biradar 08.01.2019 16:43

@kiranBiradar да, я знаю, я это изменю

Syzak 08.01.2019 16:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
63
0

Другие вопросы по теме