用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炸]涇桍.泊佹党唍?紳?篲?虹梑蒺篲?虹梑蒺篲?虹梑蒺篲?虹梑蒺
..............请哪位高手指点一下,网上都没找到解决方法,谢谢!

解决方案 »

  1.   

    String str = new String(buffer.toByteArray(),"gbk");
    System.out.println(str);如果gbk不行你试试utf-8
      

  2.   

    utf-8、gbk、gb2312我都试过了,还是会出现乱码,谢谢
      

  3.   

    String str = new String(buffer.toByteArray("ISO8859_1"),"gb2312");
    这样呢
      

  4.   

    程序还是不行,ByteArrayOutputStream类没有toByteArray(String str)这个方法……
      

  5.   

    啊,是我写错了
    String str = buffer.toString("gbk");
      

  6.   

    还是有乱码……为什么返回这段字符(
    HTTP/1.1 200 OK
    Connection: close
    Date: Sun, 20 Sep 2009 09:30:55 GMT
    Server: Microsoft-IIS/6.0
    …………
    )没乱码,而网页代码有乱码呢?
      

  7.   

    IDE是用MyEclipse 7.0信息时输出在控制台窗口(Console)似乎没有编码方式的设置项。
      

  8.   

    windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。 
      

  9.   

    默认的编码方式是GBK,该成UTF-8后运行程序还是会出现乱码。
      

  10.   

     你改成utf-8后又把刚才说的那些方法和编码方式都试过吗
      

  11.   

    学习一下,我试过也是这样的
     String test = new String(buffer.toByteArray());
          
           System.out.println(new String( test.getBytes("utf-8"),"GBK"));
            我这样试过一二不行
      

  12.   

    终于解决了,多谢各位,多谢吴老师,乱码原理是这样的:sb.append("Accept-Encoding: gzip,deflate\r\n"); //这行是确定返回的网页数据是否压缩返回,
                             压缩会提高浏览速度,所以经过gzip压缩过的网页代码直接显示就成乱码了。所以,解决方法:sb.append("Accept-Encoding: \r\n");   //这样就不压缩返回了,就没乱码了