2015-05-29 32 views
2

我有以下代碼。我似乎正在準確傳送內容。但是,圖像未被正確捕獲。我是Java新手。基本上,我是一名C,C++,Linux程序員。我想知道問題是逐行讀取緩衝區。我在這裏錯過了什麼嗎?通過JAVA中的TCP Socket在網絡上傳輸圖像無效?

這裏是socket服務器代碼 -

import java.io.*; 
import java.net.*; 


public class ImageSocketServer { 

    public static void main(String args[]) throws IOException 
    { 

     ImageSocketServer imageServer = new ImageSocketServer(); 
     imageServer.run(); 

    } 

    private void run() throws IOException { 
     // TODO Auto-generated method stub 

     ServerSocket serverSock = new ServerSocket(1025); 
     Socket sock = serverSock.accept(); 

     InputStream imagetoShare = new BufferedInputStream(new FileInputStream("/export/home/joshis1/Lizard.png")); 

     PrintStream imageSend = new PrintStream(sock.getOutputStream()); 
     imageSend.print(imagetoShare); 

    } 

} 

這裏是套接字客戶端代碼 -

import java.io.*; 
import java.net.*; 

public class ImageSocketClient { 

    public static void main(String args[]) throws IOException 
    { 

     ImageSocketClient imageClient = new ImageSocketClient(); 
     ImageSocketClient.run(); 

    } 

    private static void run() throws UnknownHostException, IOException 
    { 
     // TODO Auto-generated method stub 

     BufferedWriter bufWriter = null; 
     bufWriter = new BufferedWriter(new FileWriter( 
       "/export/home/joshis1/file1.png")); 
     Socket sock = new Socket("localhost", 1025); 
     InputStreamReader IR = new InputStreamReader(sock.getInputStream()); 
     BufferedReader BR = new BufferedReader(IR); 

     String data; 
     while ((data = BR.readLine()) != null) 
     { 
      System.out.println("Shreyas got the data"); 
      bufWriter.write(data); 
     } 

     bufWriter.close(); 
    } 


} 

我看到源圖像大小 -

$ ls -l Lizard.png 
-rw-rw-r-- 1 joshis1 joshis1 19071522 May 29 15:46 Lizard.png 

and the destination image is wrongly copied - 

$ ls -l file1.png 
-rw-rw-r-- 1 joshis1 joshis1 34 May 29 17:38 file1.png 
+0

你爲什麼使用'PrintStream'?只需從InputStream中讀取並將其寫入OutputStream即可,而不會使用BR.readline,這裏是二進制數據,而不是純文本。您可能還想看一下[The try-with-resources Statement](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html),並確保您正確處理了您的資源 – MadProgrammer

+0

「稍微」複雜[示例](http://stackoverflow.com/questions/26495165/i-get-only-one-image-while-transferring-in-a-loop-over-a-socket-in- java/26498434#26498434),但演示了通過套接字進行文件傳輸的基本原理。 – MadProgrammer

回答

4

第一你所有的imageSend.print(imagetoShare);都通過InputStream的字符串表示發送,解釋文件的小內容。您需要創建一個從imagetoShare(但您可能想更好地命名它,它不是圖像,它是一個流)的循環,並將數據寫入輸出流(搜索典型的讀寫循環)。

其次,您使用的是PrintStream,用於將字符數據寫入OutputStream。您想爲此使用BufferedOutputStream

+0

添加一些關於資源管理不當的評論,並且已經介紹了基本知識:P – MadProgrammer

+0

是的,我只是尋找一個好的重複帖子... – Kayaman

0

由於錯誤地使用各種java.io類別,您的代碼中存在各種錯誤。

1.)您正在使用PrintStreamprint(Object o)方法。這不是複製流的內容,而只是寫入對象的文本表示。

2.)在您的客戶端,您正在使用ReaderWriter類。這些用於處理字符數據,而您的圖像是原始二進制數據。考慮到編碼,非打印字符等,你會遇到很多麻煩。

結束它:使用普通的BufferedInputStream s和BufferedOutputStream s來完成您的輸入和輸出。你必須把它全部封裝在一些循環中,因爲你一次只能讀一大堆字節。