我使用RUDP协议使用这发送和接收数据包,非常有用的java库在java中实现了RUDP协议。该库的设计非常类似于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();
}
}发布于 2021-03-30 03:53:22
代码不工作,因为它假设写已经发送了字节,但是根据用于OutputStream的Javadoc
刷新此输出流,并强制写入任何缓冲的输出字节。刷新的一般约定是,调用它是一种指示,如果以前写入的任何字节被输出流的实现所缓冲,这些字节应该立即被写入它们的预期目的地。
因此,将此添加到客户端将确保某些内容被发送。
os.flush();事实证明,RUDP库就是这样的--假设这是第109行中的ReliableSocketOutputStream的实际源代码,那么在这个类中,底层套接字实际上是写在flush()中的唯一位置。
在服务器端,它应该处于循环状态,直到连接关闭。请参阅用于InputStream的Javadoc
从输入流中读取一定数量的字节并将其存储到缓冲区数组b中。实际读取的字节数作为整数返回。此方法将阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。
因此,如果它正在返回,并且没有任何数据,这是因为其他原因(文件末尾是封闭流/套接字的同义词)。
https://stackoverflow.com/questions/66864241
复制相似问题