2012-04-12 52 views
2

我想从Java服务器发送一个二进制文件到C#客户端。下面是我使用的代码:发送文件从Java到C#

Java服务器:

ServerSocket serverSocket = new ServerSocket(1592); 
    Socket socket = serverSocket.accept(); 
    PrintWriter out = new PrintWriter(socket.getOutputStream(),true); 

    File file = new File("img.jpg"); 

    //send file length 
    out.println(file.length()); 

    //read file to buffer 
    byte[] buffer = new byte[(int)file.length()]; 
    DataInputStream dis = new DataInputStream(new FileInputStream(file)); 
    dis.read(buffer, 0, buffer.length); 

    //send file 
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 
    bos.write(buffer); 
    bos.flush(); 

    Thread.sleep(2000); 

C#客户端:

 //connect to server 
     TcpClient tcpClient = new TcpClient(); 
     tcpClient.Connect("127.0.0.1", 1592); 
     NetworkStream networkStream = tcpClient.GetStream(); 

     StreamReader sr = new StreamReader(networkStream); 

     //read file length 
     int length = int.Parse(sr.ReadLine()); 
     Console.WriteLine("File size: {0} bytes", length); 

     //read bytes to buffer 
     byte[] buffer = new byte[length]; 
     networkStream.Read(buffer, 0, (int)length); 

     //write to file 
     BinaryWriter bWrite = new BinaryWriter(File.Open("C:/img.jpg", FileMode.Create)); 
     bWrite.Write(buffer); 

     bWrite.Flush(); 
     bWrite.Close(); 

此代码似乎只写的第69696个字节的文件。从那里它只会​​写0直到结束。

任何提示?

由于

回答

3

MSDN:“读为是可用的,直到由尺寸参数指定的字节数操作读取尽可能多的数据”

这意味着您不一定会获得尽可能多的数据,您需要检查自己,直到获得尽可能多的数据。

int toRead = (int)length; 
int read = 0; 
while (toRead > 0) 
{ 
    int noChars = networkStream.Read(buffer, read, toRead); 
    read += noChars; 
    toRead -= noChars; 
} 
+0

谢谢!这解决了我的问题。 :d – 2012-04-12 18:21:12

0

检查DataInputStream实际读取的字节数,它可能小于您分配的数组的长度。

同样适用于客户端。