我试图在没有运气的情况下搜索答案(包括google和StackOverflow)
我正在编写一个java程序,其中服务器和客户端可以通过发送/接收数据和文件进行通信......
我发送的文件大小分别为1MB。为了让客户端知道块的数量,我发送一个包含BlockNb=x
的字符串行,其中x是块的数量,后跟文件。
然而,当我从客户端阅读时,我收到的是一些奇怪的字符而不是这一行:ur\u0000\u0002[B¬ó\u0017ø\bTà\u0002\u0000\u0000xp\u0000\u0000\bP
其中\b
和\uxxxx
是其价值的代表(我是期待这里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);
}
P.S。:当我从服务器端移除最后3行(仅)时,一切正常。我按预期收到BlockNb=1
。所以问题只出现在混合了两种类型的数据/两种类型的outputStreams
英语是我的第三语言,所以请原谅我语法错误或单词滥用
编辑:这里的主要问题是我忘了冲洗流。然而,当我刷新流时,我开始收到EOFException(如果我应用了读/写的顺序,我可以避免调试 - 存在一种同步问题)所以我使用了QuickSilver的解决方案,除此之外还有效齐平。
答案 0 :(得分:1)
我会避免使用两个不同的对象来写入和读取同一个流。尝试使用服务器端的ObjectOutputStream和客户端的ObjectInputStream。处理字符串的方式与处理缓冲区的方式相同:
服务器:outputStream.writeObject("BlockNb=1");
客户:String blockNbStr = inputStream.readObject();