Пакеты RUDP не читаются из входного потока
Я использую протокол RUDP для отправки и получения пакетов, используя эту очень полезную библиотеку Java, которая реализует протокол RUDP в java. Дизайн библиотеки очень похож на TCP. Он сравнительно использует
ReliableServerSocket
как ServerSocket и
ReliableSocket
как сокет.
Однако я натыкаюсь на ошибку, когда создаю клиентское соединение с сервером. Соединение между сервером и клиентом успешно создано, потому что выполняется все, что происходит после метода accept(). Однако входной поток не содержит байтов при попытке чтения из него.
Клиент:
public class Client {
ReliableSocket rs;
public Client() throws IOException {
rs = new ReliableSocket();
rs.connect(new InetSocketAddress("127.0.0.1", 3033));
String message = "Hello";
byte[] sendData = message.getBytes();
OutputStream os = rs.getOutputStream();
os.write(sendData, 0, sendData.length);
}
public static void main(String[] args) throws IOException {
new Client();
}
}
Сервер:
public class Server {
ReliableServerSocket rss;
ReliableSocket rs;
public Server() throws Exception {
rss = new ReliableServerSocket(3033);
while (true) {
rs = (ReliableSocket) rss.accept();
System.out.println("Client connected");
byte[] buffer = new byte[100];
InputStream in = rs.getInputStream();
in.read(buffer);
//here the value doesn't return from the inputstream
System.out.println("message from client: " + new String(buffer).trim());
}
}
public static void main(String[] args) throws Exception {
new Server();
}
}
1 ответ
Код не работает, потому что он предполагает, что запись отправила байты, однако согласно Javadoc для OutputStream
Сбрасывает этот выходной поток и принудительно записывает любые буферизованные выходные байты. Общий принцип сбрасывания заключается в том, что его вызов указывает на то, что если какие-либо ранее записанные байты были буферизованы реализацией выходного потока, такие байты должны быть немедленно записаны по назначению.
Поэтому добавьте это к клиенту, чтобы убедиться, что что-то отправлено.
os.flush();
Оказывается, это относится к библиотеке RUDP - если предположить, что это фактический исходный код для ReliableSocketOutputStream в строке 109, это единственное место в этом классе, в которое фактически записывается базовый сокет, т.е. в
На стороне сервера - он должен сидеть в цикле, пока соединение не будет закрыто. См. Javadoc для InputStream
Считывает некоторое количество байтов из входного потока и сохраняет их в буферный массив b. Количество фактически прочитанных байтов возвращается как целое число. Этот метод блокируется до тех пор, пока не будут доступны входные данные, не будет обнаружен конец файла или не возникнет исключение.
Поэтому, если он возвращается и данных нет, это происходит по другим причинам (конец файла является синонимом закрытого потока/сокета).