【发布时间】:2020-12-03 05:42:24
【问题描述】:
我有一个小项目,在C# 中运行一个服务器,在Java 中运行一个客户端。服务器将图像发送到客户端。
有些图像非常大(有时高达 10MiB),所以我将图像字节拆分并以 32768 bytes 的块发送。
我的 C# 服务器代码如下:
using (var stream = new MemoryStream(ImageData))
{
for (int j = 1; j <= dataSplitParameters.NumberOfChunks; j++)
{
byte[] chunk;
if (j == dataSplitParameters.NumberOfChunks)
chunk = new byte[dataSplitParameters.FinalChunkSize];
else
chunk = new byte[dataSplitParameters.ChunkSize];
int result = stream.Read(chunk, 0, chunk.Length);
string line = DateTime.Now + ", Status OK, " + ImageName+ ", ImageChunk, " + j + ", " + dataSplitParameters.NumberOfChunks + ", " + chunk.Length;
//write read params
streamWriter.WriteLine(line);
streamWriter.Flush();
//write the data
binaryWriter.Write(chunk);
binaryWriter.Flush();
Console.WriteLine(line);
string deliveryReport = streamReader.ReadLine();
Console.WriteLine(deliveryReport);
}
}
而我的Java客户端代码如下:
long dataRead = 0;
for (int j = 1; j <= numberOfChunks; j++) {
String line = bufferedReader.readLine();
tokens = line.split(", ");
System.out.println(line);
int toRead = Integer.parseInt(tokens[tokens.length - 1]);
byte[] chunk = new byte[toRead];
int read = inputStream.read(chunk, 0, toRead);
//do something with the data
dataRead += read;
String progressReport = pageLabel + ", progress: " + dataRead + "/" + dataLength + " bytes.";
bufferedOutputStream.write((progressReport + "\n").getBytes());
bufferedOutputStream.flush();
System.out.println(progressReport);
}
问题是当我运行代码时,客户端崩溃并显示正在读取虚假数据的错误,或者客户端和服务器都挂起。这是错误:
Document Page 1, progress: 49153/226604 bytes.
�9��%>�YI!��F�����h�
Exception in thread "main" java.lang.NumberFormatException: For input string: .....
我做错了什么?
【问题讨论】:
-
调试您的应用程序。您的代码假定您可以拆分到达客户端的任何行。如果二进制数据包含换行符(0x0D 0x0A 或只是 0x0A)会怎样?
-
@f1sh 我不认为是这样,因为我有一个定义明确的协议:(1)服务器发送
read params作为文本数据,客户端读取一行作为文本数据; (2) 服务器发送预定义大小的二进制数据,客户端读取预定义大小的二进制数据; (3)客户端发送文本数据行,服务器读取文本数据行。我只是想知道这个协议是如何崩溃的。 -
您首先发送一个日期时间。你处理过吗?出于多种原因,一旦将原始流包装在 BufferedReader 中,就不要使用它。
-
您是否曾经将
line打印到控制台?这将是开始调试过程的第一件事。
标签: java c# networking tcp large-data