2012-04-12 64 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實際讀取的字節數,它可能小於您分配的數組的長度。

同樣適用於客戶端。