Я хотел бы, чтобы, когда сервер получает сообщение от клиента, и сообщение, например, «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-адреса и порты, чтобы убедиться, что все в порядке, и все ли печатается правильно.
Я не получаю ошибок.
Кто-нибудь знает, как отправить сообщение после определенного сообщения от клиента?
У вас неопределенное поведение for(k=0; k<strlen(buffer)-1; k++){tmp[0] = buffer[k]; strcat(cmd, tmp);}, если strlen(buffer)-1 больше, чем 10 (char cmd[10] = "";).
@kiranBiradar да, я знаю, я это изменю




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