У меня есть простой сервер C и Java-клиент. Я отправляю текстовый файл построчно от сервера к клиенту:Как определить конец чтения
do {
send(sockfd, line, strlen(line), 0);
printf("%s\n", line);
} while ((fgets(line, 100, fp)) != NULL);
и читать его в Java клиента с:
Client.getCl().getInputStream().read(inmsg);
do{
decoded = new String(inmsg, "UTF-8");
System.out.println(decoded);
}while(Client.getCl().getInputStream().read(inmsg) > 0);
Моя проблема заключается в том, что я не знаю, как отправить «конец чтения "от сервера к клиенту. Клиент замораживается при последнем чтении. Я знаю, что метод read()
возвращает целое число с числом получающих байтов и -1, когда читать нечего и 0, когда длина буфера равна нулю. Единственное решение, которое возвращало -1 клиенту, заключалось в том, чтобы закрыть сокет на стороне сервера, но я не могу его использовать. Также я попробовал следующее:
1) Отправить 0 Длина в конце отправки способ сказать клиенту, что длина равна нулю:
send(sockfd, NULL, NULL, 0);
2) Определить флаги и отправить:
#define MSG_FIN 0x200
#define MSG_EOR 0x0080
и снова с обоими флагами:
send(sockfd, NULL, NULL, MSG_FIN);
send(sockfd, NULL, NULL, MSG_EOR);
Кто-нибудь, пожалуйста, помогите, что я делаю неправильно здесь? Спасибо
Я знаю, что вы сказали, что не можете его использовать, но _why_ вы не можете закрыть сокет на сервере? Если вы не хотите закрыть его, разве это не означает, что вы собираетесь отправить что-то еще позже? И если это так, то Java все равно сможет читать, не так ли? –
Возможно, вам захочется выяснить, сколько байтов вы собираетесь отправить, и префикс ваших данных с этим номером, чтобы клиент мог определить, когда прекратить чтение. Это похоже на заголовок ['Content-Length'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13) в HTTP. –
Если вам нужно отправлять отдельные «сообщения» по TCP-соединению, это проблема на уровне приложений, которую вы должны реализовать и обработать самостоятельно. TCP действительно не относится к этому. (UDP делает, но его ненадежность, вероятно, делает его непригодным для вашего случая использования. То есть, не потоковая передача мультимедиа или P2P.) – millimoose