0

我正在使用 RUDP 协议使用这个非常有用的 java 库来发送和接收数据包,它在 java 中实现了 RUDP 协议。该库的设计与 TCP 非常相似。它比较使用 aReliableServerSocket作为 ServerSocket 和 aReliableSocket作为 Socket。

但是,当我创建与服务器的客户端连接时,我确实偶然发现了一个错误。服务器和客户端之间的连接已成功创建,因为所有通过 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();
}

}
4

1 回答 1

0

该代码不起作用,因为它假定 write 已发送字节,但是根据OutputStream 的 Javadoc

刷新此输出流并强制写出任何缓冲的输出字节。flush 的一般约定是调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。

因此,将此添加到客户端将确保发送某些内容。

  os.flush();

事实证明,RUDP 库就是这种情况 - 假设这是ReliableSocketOutputStream的实际源代码,第 109 行是该类中唯一实际写入底层套接字的位置,即 in flush()

在服务器端 - 它应该循环直到连接关闭。参见 InputStream 的 Javadoc

从输入流中读取一些字节并将它们存储到缓冲区数组 b. 实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

因此,如果它正在返回并且没有任何数据,那是因为其他原因(文件结尾是关闭流/套接字的同义词)。

于 2021-03-30T03:53:22.270 回答