2015-08-31 28 views
2

我正在创建一个简单的HTTP服务器(使用maven)。当用户输入http://127.0.0.1:8181/pic时,应显示图像。为什么在通过套接字写入发送时客户端浏览器中的图像不显示?

当我跑班,输入http://127.0.0.1:8181/pic,图像不显示;我只是得到垃圾字符的线条!

代码:

public static void main(String[] args) throws Exception { 
    int port = 8181; 

    ServerSocket server = new ServerSocket(port); 
    System.out.println("Listening for a connection on port " + port + " ..."); 

    while (true) { 
     Socket client = server.accept(); 
     System.out.println("A client connected: " + client.getInetAddress()); 

     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 

     String line = in.readLine(); 
     while (!line.isEmpty()) { 
      System.out.println(line); 

      String[] firstLine = line.split("\\s+"); // line is like: GET /pic HTTP/1.1 
      String method = firstLine[0]; 

      if (method.equalsIgnoreCase("GET")) { 

       String resourceNme = firstLine[1]; 

       if (resourceNme.equals("/pic")) { 

        out.write("Server: Apache/0.8.4\r\n"); 
        out.write("Content-Type: text/html\r\n"); 
        out.write("Content-type: image/gif"); 

        out.write("\r\n"); 
        out.write("<TITLE>Example Image</TITLE>"); 

        //find file in system and send as response 
        URL url = SimpleHTTPServer.class.getResource("/office.jpg"); 
        File file = new File(url.toURI()); 

        if (file.exists()) { 
         System.out.println("file exists"); 
         ImageInputStream imageInputStream = ImageIO.createImageInputStream(file); 
         long size = imageInputStream.length(); 

         BufferedImage bufferedImage = ImageIO.read(file); 
         boolean success = ImageIO.write(bufferedImage, "jpeg", client.getOutputStream()); 
         System.out.println("Success: " + success); // is true 
        } else { 
         System.out.println("don't exists"); 
        } 

        out.close(); 
        in.close(); 
        client.close(); 
        break; 

       } 
      } 
     } 
    } 
} 

示例输出接收到的:

SHùiƃ@8¤ÇîÔéHŽ”c­;… äúÑ“ëIŠ[email protected]ËQ“ï@¥Å��œ÷¥Éõ¢Š�9õ¥Éõ¤¥ 'Ö€ÄzÑF(wzFb;ÑPÈø¤d”Œòj³HÄõ4®ù¨è»›ûÆÍýãIE�.æþñ£sxÒb—�noï7·÷£�ííêi|Æþñ¦âœ�Û?xÒïoïLR†
íýãNÞßÞ4ÜRâ€{xѽ¿¼i1F)�»›ûÆÍýãE�noSFæõ4bŒPîoïPíýãH ooï77÷ ¸ ÙûÆ—sxÓ@æ—�»›ûÆ—-ëMÅ--ýãFæõ4QŠ�]ÍêiK6:ÒRã4Ä"ï,�'šé4]5‹od•Ÿ§é­1G*H<×saf©œ`ŽÕ¤DÉ µÅXÆÓš~=iÈÅjf0¯9 ¨àŠ[email protected] 2äç¸ÈÎ)øãÆ)€ÜdRàÆ)zR‚E �7-�”v P�(�r)hÆ 
0œbŒu¥ÆiHç4�˜”`n¥Åw Ú3JGJZ"€G|R°Î)våhÆåÅ�>ZR2™ |Ê>”ª3=)0 
£f=©/ð§'+BŒ(c�¸¸Å‌ 

更新的代码与HTML相关响应代码除去

   if (resourceNme.equals("/pic")) { 
        out.write("Server: Apache/0.8.4\r\n"); 
        out.write("Content-type: image/jpeg\r\n"); 

        URL url = SimpleHTTPServer.class.getResource("/office.jpg"); 
        File file = new File(url.toURI()); 

        if (file.exists()) { 
         System.out.println("file exists"); 
         ImageInputStream imageInputStream = ImageIO.createImageInputStream(file); 
         long size = imageInputStream.length(); 
         out.write("Content-Length: " + size + "\r\n"); 
         out.write("\r\n"); 

         BufferedImage bufferedImage = ImageIO.read(file); 
         boolean success = ImageIO.write(bufferedImage, "jpeg", client.getOutputStream()); 
         System.out.println("Success: " + success); //true 
         out.close(); 
         in.close(); 
         client.close(); 
         break; 
        } else { 
         System.out.println("don't exists"); 
         out.close(); 
         in.close(); 
         client.close(); 
         break; 
        } 
       } 
+0

尝试更改您的页面编码。它可能会显示一条错误消息。 –

+0

@DanielCheung它在'unicode'中,改成什么? –

+0

其他任何事情,并尝试看看你是否可以理解任何不同的编码,以检查这个**是否真的是垃圾文本。 –

回答

1

您正在将图片的文本和二进制数据直接发送给对方。浏览器应该如何知道如何区分这两者?如果你想结合HTML和图像,你应该在你的HTML中有一个href = ...元素。如果您只想发送图片,请将内容类型设置为image/jpeg,但不能同时拥有两种内容类型。删除你的第一个内容类型的行,删除其中的TITLE行。更改您希望能够将图片调用到pic.jpg的URL,它应该可以正常工作。

相关问题