在 Java 中从套接字流中读取文本和二进制文件时出现奇怪的字符



我曾试图搜索一个答案,但没有成功(在谷歌和StackOverflow上)

我正在编写一个java程序,其中服务器和客户端可以通过发送/接收数据和文件进行通信。。。

我正在按每个1MB的块发送文件。为了让客户端知道块的数量,我发送了一个包含BlockNb=x的字符串行,其中x是块的数目,后面跟着文件。

然而,当我从客户端读取它时,我收到的不是这一行,而是一些奇怪的字符:uru0000u0002[B¬óu0017øbTàu0002u0000u0000xpu0000u0000bP,其中buxxxx是它们值的代表(我在这里期待BlockNb=1

(以更清晰的方式编写:ur [B¬ó ø Tà xp P(其中空格是转义字符)

这是我的密码
服务器端

try (
        ServerSocket welcome = new ServerSocket(6500);
        Socket socket = welcome.accept();
        ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream())
    )
    {
        System.out.println("accepted");
        File f = new File("...");  //the file path
        try (
            FileInputStream fileInputStream = new FileInputStream(f)
        )
        {
            long length = f.length();
            byte[] buffer;
            //here I put only the code that was executed
            buffer = new byte[(int) length];
            printWriter.println("BlockNb=1");
            fileInputStream.read(buffer);
            outputStream.writeObject(buffer);
            printWriter.println("}");
        }
    }

客户端

try (
        Socket socket = new Socket("localhost", 6500);
        ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
        FileOutputStream fileOutputStream = new FileOutputStream("C:/D/test.txt");
        Scanner scanner = new Scanner(socket.getInputStream())
    )
    {
        String msg = scanner.nextLine();  //the weird string was read at this point
        long blockNb = Long.parseLong(msg.split("BlockNb=", 2)[1]);
        byte[] file = (byte[]) inputStream.readObject();
        fileOutputStream.write(file);
    }

第页。S.:当我从服务器端删除最后3行(仅)时,一切都正常了。我收到了预期的BlockNb=1。因此,问题只出现在两种类型的数据/两种类型输出流混合的情况下

英语是我的第三语言,如果语法不好或单词误用,请原谅

编辑:这里的主要问题是我忘了冲洗溪流。然而,当我刷新流时,我开始收到EOFException(如果我应用读/写排序,我可以在调试中避免这种情况——存在一种同步问题),所以我使用了QuickSilver的解决方案,该解决方案除了刷新之外还起作用。

我会避免使用两个不同的对象对同一个流进行写入和读取。尝试只在服务器端使用ObjectOutputStream,在客户端使用ObjectInputStream。处理字符串的方式与处理缓冲区的方式相同:

服务器:outputStream.writeObject("BlockNb=1");

客户端:String blockNbStr = inputStream.readObject();

相关内容

  • 没有找到相关文章

最新更新