Question

I'm trying to get an image hosting on our server available to be displayed on a client. As per the specs of the project:

"When a Client receives such a URL, it must download the contents (i.e., bytes) of the file referenced by the URL. Before the Client can display the image to the user, it must first retrieve (i.e., download) the bytes of the image file from the Server. Similarly, if the Client receives the URL of a known data file or a field help file from the Server, it must download the content of those files before it can use them."

I'm pretty sure we have the server side stuff down, because if I put the url into a browser it retrieves and displays just fine. So it must be something with the ClientCommunicator class; can you take a look at my code and tell me what the problem is? I've spent hours on this.

Here is the code:

Where I actually call the function to get and display the file: (This part is working properly insofar as it is passing the right information to the server)

JFrame f = new JFrame();
    JButton b = (JButton)e.getSource();
    ImageIcon image = new ImageIcon(ClientCommunicator.DownloadFile(HOST, PORT, b.getLabel()));
    JLabel l = new JLabel(image);
    f.add(l);
    f.pack();
    f.setVisible(true);

From the ClientCommunicator class:

 public static byte[] DownloadFile(String hostname, String port, String url){
    String image = HttpClientHelper.doGetRequest("http://"+hostname+":"+port+"/"+url, null);
    return image.getBytes();
}

The pertinent httpHelper:

public static String doGetRequest(String urlString,Map<String,String> headers){
    URL url;
    HttpURLConnection connection = null;
    try {
        //Create connection
        url = new URL(urlString);
        connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Content-Language", "en-US");

        connection.setUseCaches (false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        if(connection.getResponseCode() == 500){
            return "failed";
        }
        //Get Response
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while((line = rd.readLine()) != null) {
            response.append(line);
        }
        rd.close();
        return response.toString();

    } catch (Exception e) {

        e.printStackTrace();
        return null;

    } finally {

        if(connection != null) {
            connection.disconnect();
        }
    }
}

After that, it jumps into the server stuff, which as I stated I believe is working correctly because clients such as Chrome can retrieve the file and display it properly. The problem has to be somewhere in here.

I believe that it has to do with the way the bytes are converted into a string and then back, but I do not know how to solve this problem. I've looked at similar problems on StackOverflow and have been unable to apply them to my situation. Any pointers in the right direction would be greatly appreciated.

Was it helpful?

Solution

If your server is sending binary data, you do not want to use an InputStreamReader, or in fact a Reader of any sort. As the Java API indicates, Readers are for reading streams of characters (not bytes) http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html, which means you will run into all sorts of encoding issues.

See this other stack overflow answer for how to read bytes from a stream:

Convert InputStream to byte array in Java

OTHER TIPS

Do your homework.

  1. Isolate the issue. Modify the server side to send only 256 all possible bytes. Do a binary search and reduce it to small set of bytes.
  2. Use http proxy tools to monitor the bytes as they are transmitted. Fiddler in windows world. Find other ones for the *nix environments.
  3. Then see where the problem is happening and google/bing the suspicions or share the result.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top