-
java socket 保存的图片为什么打不开?问题出在哪?求指点20
有些图片连接是https的,用socket保存一个网页上的验证码图片到本地,打开后显示 无法预览 是为什么啊?代码如下:
import java.net.*;
import java.io.*;
public class HTTPClient{
String host="reg.email.163.com";
int port=80;
Socket socket;
public void createSocket()throws Exception{
socket=new Socket(host, port);
}
public void communicate()throws Exception{
StringBuffer sb=new StringBuffer("GET /unireg/call.do?cmd=register.verifyCode&env=369398958183&t=1351924543383 HTTP/1.1\r\n");
sb.append("Host: reg.email.163.com\r\n");
sb.append("Accept: */*\r\n");
sb.append("Accept-Language: zh-cn\r\n");
sb.append("Accept-Encoding: gzip, deflate\r\n");
sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n");
sb.append("Connection: Keep-Alive\r\n\r\n");
OutputStream socketOut=socket.getOutputStream();
socketOut.write(sb.toString().getBytes());
socket.shutdownOutput();
InputStream socketIn=socket.getInputStream();
ByteArrayOutputStream buffer=new ByteArrayOutputStream();
byte[] buff=new byte[1024];
int len=-1;
while((len=socketIn.read(buff))!=-1){
buffer.write(buff,0,len);
}
socket.close();
FileOutputStream fos=new FileOutputStream(new File("c:\\1.jpg"));
OutputStreamWriter osw=new OutputStreamWriter(fos);
osw.write((new String(buffer.toByteArray())).split("\r\n\r\n")[1]);
osw.flush();
osw.close();
}
public static void main(String arch[])throws Exception{
HTTPClient client=new HTTPClient();
client.createSocket();
client.communicate();
}
}
求指点!!!2012年11月03日 17:21
1个答案 按时间排序 按投票排序
-
用抓包工具看一下http response回来的内容,header部分有下面一句:
Transfer-Encoding: chunked
说明使用了chunked传输方式,所以body部分的内容不是单纯的jpeg的内容,里面的内容是一段一段的,每一段有两部分,一个是16进制的长度信息,接着是指定长度的jpeg内容,中间用\r\n来分隔,最后已0结束,标准着全部结束。比如:
12
abcdabcdabcd
3
abc
0
说明body内容是:abcdabcdabcdabc
所以,需要把16进制的长度信息还有结尾的0过滤掉。
你访问的这个url好像只有一段,所以可以修改成下面这样试一试,如果有多段就需要得到用\r\n split后的String数组,然后循环过滤掉16进制的长度信息就可以了,循环里面取奇数次循环的内容即可,比如1,3,5,7等等。
osw.write((new String(buffer.toByteArray())).split("\r\n\r\n")[1].split("\r\n")[1]));
下面是用抓包工具抓到的内容,供参考:
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 04 Nov 2012 10:20:17 GMT
Content-Type: image/jpeg;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: JSESSIONID=5DE621BDAB2CC13C5C4BE2BE1EB6CAD5; Path=/unireg
pragma: NO-cache
Cache-Control: no-cache
Expries: Thu, 01 Jan 1970 00:00:00 GMT
Content-Language: zh-CN
X-Cache: from ngx98-208.163.com
724
xxxxxx
xxxxxxxxx
xxxx
0
下面的文章也可以参考一下,是介绍chunked的。
http://desert3.iteye.com/blog/1461148
2012年11月04日 21:30
相关推荐
通过学习和实践"Java Socket传输图片源代码",开发者可以掌握网络编程的基本原理和技巧,为构建更复杂的分布式系统打下坚实基础。同时,这个例子也适合初学者作为入门教程,通过实际操作加深对Socket编程的理解。在...
### Java Socket 图片传输知识点详解 #### 一、TCP协议简介 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在互联网的应用中,TCP协议提供了一种...
在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库中。这个过程涉及到多个关键知识点,下面我们将详细探讨。 1. **Java Socket基础**:...
连接池是在应用程序启动时创建一定数量的Socket连接,并将它们保存在一个集合中,当需要建立新的网络连接时,从池中获取一个已经建立好的连接,使用完毕后归还给池,而不是立即关闭。这样可以避免频繁的创建和销毁...
在"Java Socket 视频流转发Socket"这个主题中,我们将深入探讨如何使用Java Socket来处理视频流的传输。 首先,让我们了解什么是ServerSocket。在Java中,`java.net.ServerSocket`类是服务器端使用的,它监听特定...
Java Socket是Java编程语言中实现网络通信的基础组件,它提供了应用程序与网络协议的接口,使得开发者可以构建基于TCP(传输控制协议)或UDP(用户数据报协议)的应用程序。本教程将深入探讨Java Socket编程的核心...
### Java Socket 使用加密协议传输对象:深入解析与实践 在当今互联网时代,数据安全成为企业和个人用户关注的焦点。在Java开发中,Socket编程是一种常见的网络通信方式,它允许不同计算机上的应用程序通过网络进行...
在Java编程语言中,Socket是实现网络通信的基础组件,它为两台计算机之间的通信提供了低级别的接口。在本文中,我们将深入探讨Java Socket客户端代码及其在创建基于Socket的聊天室客户端中的应用。 首先,理解...
Java Socket编程是网络通信的基础,尤其在开发多人聊天应用、文件传输等功能时,它是不可或缺的一部分。本项目实现了基于Java Socket的多人聊天功能,包括群聊、私聊以及文本、图片和文件的发送与接收,提供了丰富的...
Java Socket 是一种网络通信协议,它是Java编程语言中实现客户端-服务器模型的基础。Socket 提供了低级别的、面向连接的、双向通信的网络接口,允许应用程序通过网络进行数据传输。在本示例中,我们将深入探讨Java ...
Java Socket编程是网络编程的基础,它是Java API提供的一种用于实现客户端-服务器通信的接口。在Java中,Socket类和ServerSocket类是进行网络通信的核心组件。这个经典版本可能包含了一系列关于如何有效使用Java ...
Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...
java socket源码解析 java socket源码解析 java socket源码解析 java socket源码解析
Java Socket 实现 SMTP 发送邮件是一项常见的编程任务,尤其在自动化通知、系统间通信或用户交互中非常有用。SMTP(Simple Mail Transfer Protocol)是互联网上用于传输电子邮件的标准协议,而Java Socket则是Java...
java socket client 断线重连的简单实现 有什么意见可以提哦
在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...
本教程将深入探讨Java Socket的相关知识点,旨在帮助开发者理解和掌握如何在Java环境中构建网络应用程序。 一、Socket基础 Socket在计算机网络中扮演着桥梁的角色,连接了两个网络进程进行数据传输。Java Socket类...
Java SocketCAN是一个用于在Linux环境下通过Java编程语言与CAN(Controller Area Network)总线通信的库。这个库允许开发者在Java应用程序中实现低级别的CAN数据帧收发,从而无需深入理解底层操作系统或C/C++编程。...
在这个场景中,我们讨论的是如何使用Java Socket来实现实时的屏幕监控功能,即服务端能够远程查看客户端的屏幕内容,这样的功能在远程协助、监控或者演示场景中非常有用。 首先,我们需要了解Java Socket的基本概念...