通过TcpClient将位图从C#服务器程序传输到Java套接字已损坏



服务器程序C#

private TcpListener serverSocket;
..
init:
serverSocket = new TcpListener(ipAddress, port_number);
when new connection request found:
TcpClient clientSock = default(TcpClient);
clientSock = serverSocket.AcceptTcpClient();
NetworkStream networkStream = clientSocket.GetStream();
String FileName = requested binary data file name from client
Byte[] sendBytes = null;
if (File.Exists(pkgName))
{
//load file contents
sendBytes = File.ReadAllBytes(pkgName);
}
if (sendBytes != null)
{
    networkStream.Write(sendBytes, 0, sendBytes.Length); //sendBytes.Length = 1001883;
    networkStream.Flush();
}
...

Java Android代码:客户端

InetAddress serverAddr = InetAddress.getByName(serverIp);
Log.d("SideloadManager", "C: Connecting...");
Socket socket = new Socket(serverAddr, serverPort);
InputStream inFromServer = socket.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
FileOutputStream outStream = new FileOutputStream("...recieved.bmp");
int size = 1001883; //same size from server
byte[] buf = new byte[size];
in.read(buf);   
outStream.write(buf, 0, buf.length);
outStream.flush();
outStream.close();

received.bmp的大小与服务器上的大小相同,为1001883字节。但是它的内容被破坏了。调试后,我看到:在C#程序上,字节数组为[14914510,10,..]在Java程序上,字节数组是:[-105,-101,10,…..]这是由于Java 中的有符号字节

我缺少什么来接收正确的位图?

解决方法如下:

替换:

int size = 1001883; //same size from server
byte[] buf = new byte[size];
in.read(buf);   
outStream.write(buf, 0, buf.length);

这个:

int len=-1;             
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, buf.length)) > 0) {
   outStream.write(buf, 0, len);
}

解决了问题:)

数据传输正确,因为149和-105具有与字节相同的二进制表示。更可能的问题是,您没有读取在java端发送的所有数据。

read方法返回已读取的字节数,当到达流的末尾时返回-1。你需要一个循环来读取整个文件:

int bytesRead;
while ((bytesRead = in.read(buf)) != -1) {
    outStream.write(buf, 0, bytesRead);
}

最新更新