java socket 访问网络返回乱码,请高手指点。

玩转Flutter 2009-09-20 03:24:52
用socket访问网络,比如:www.baidu.com,返回的是一段乱码字符,访问代码如下:

// webAddress = www.baidu.com
public void linkButClick() throws Exception, IOException{
String webAddress = webAddressFie.getText().trim();

Socket socket = new Socket(webAddress, 80);
StringBuffer sb = new StringBuffer("GET "+"/"+" HTTP/1.1\r\n");
sb.append("Host: "+webAddress+"\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/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8)\r\n");
sb.append("Connection: keep-alive\r\n\r\n");

System.out.println(sb.toString());

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);
}
System.out.println(new String(buffer.toByteArray()));

}

返回的字符如下:

GET / HTTP/1.1 // 发送请求的字符串
Host: www.baidu.com
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8)
Connection: keep-alive


HTTP/1.1 200 OK // 返回的字符串
Date: Sun, 20 Sep 2009 07:17:49 GMT
Server: BWS/1.0
Content-Length: 1745
Content-Type: text/html
Cache-Control: private
Expires: Sun, 20 Sep 2009 07:17:49 GMT
Content-Encoding: gzip
Set-Cookie: BAIDUID=E9DF2B0254DB765B944F62650997DCBA:FG=1; expires=Sun, 20-Sep-39 07:17:49 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "

// 以下全是乱码

pn]鞥]赝呚+縘y龅鐃?# g?N
<漸鮩筟U炸]涇桍.泊佹党唍?紳?pn]鞥]赝呚+縘y龅鐃?# g?N
<漸鮩筟U炸]涇桍.泊佹党唍?紳?pn]鞥]赝呚+縘y龅鐃?# g?N
<漸鮩筟U炸]涇桍.泊佹党唍?紳?篲?虹梑蒺篲?虹梑蒺篲?虹梑蒺篲?虹梑蒺
..............

请哪位高手指点一下,网上都没找到解决方法,谢谢!
...全文
521 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
玩转Flutter 2009-09-23
  • 打赏
  • 举报
回复
终于解决了,多谢各位,多谢吴老师,乱码原理是这样的:

sb.append("Accept-Encoding: gzip,deflate\r\n"); //这行是确定返回的网页数据是否压缩返回,
压缩会提高浏览速度,所以经过gzip压缩过的网页代码直接显示就成乱码了。

所以,解决方法:

sb.append("Accept-Encoding: \r\n"); //这样就不压缩返回了,就没乱码了
玩转Flutter 2009-09-21
  • 打赏
  • 举报
回复
没解决啊,哪位高手帮帮忙不?
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
哦,谢谢
java_lover_coming 2009-09-20
  • 打赏
  • 举报
回复
学习一下,我试过也是这样的
 String test = new String(buffer.toByteArray());

System.out.println(new String( test.getBytes("utf-8"),"GBK"));
我这样试过一二不行
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
试过了,还是有乱码……
gesanri 2009-09-20
  • 打赏
  • 举报
回复
。。。 你改成utf-8后又把刚才说的那些方法和编码方式都试过吗
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
默认的编码方式是GBK,该成UTF-8后运行程序还是会出现乱码。
gesanri 2009-09-20
  • 打赏
  • 举报
回复
windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
IDE是用MyEclipse 7.0信息时输出在控制台窗口(Console)似乎没有编码方式的设置项。
gesanri 2009-09-20
  • 打赏
  • 举报
回复
你的IDE是不是utf-8编码的
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
全部网页代码都市乱码。
gesanri 2009-09-20
  • 打赏
  • 举报
回复
乱码部分是中文吧
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
还是有乱码……

为什么返回这段字符(
HTTP/1.1 200 OK
Connection: close
Date: Sun, 20 Sep 2009 09:30:55 GMT
Server: Microsoft-IIS/6.0
…………
)没乱码,而网页代码有乱码呢?
gesanri 2009-09-20
  • 打赏
  • 举报
回复
啊,是我写错了
String str = buffer.toString("gbk");
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
程序还是不行,ByteArrayOutputStream类没有toByteArray(String str)这个方法……
gesanri 2009-09-20
  • 打赏
  • 举报
回复
String str = new String(buffer.toByteArray("ISO8859_1"),"gb2312");
这样呢
玩转Flutter 2009-09-20
  • 打赏
  • 举报
回复
utf-8、gbk、gb2312我都试过了,还是会出现乱码,谢谢
gesanri 2009-09-20
  • 打赏
  • 举报
回复
String str = new String(buffer.toByteArray(),"gbk");
System.out.println(str);

如果gbk不行你试试utf-8

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧