csusky

常用链接

统计

最新评论

SOCKET基础 学习笔记

 

  1package com;
  2
  3import java.io.BufferedReader;
  4import java.io.ByteArrayOutputStream;
  5import java.io.FilterOutputStream;
  6import java.io.IOException;
  7import java.io.InputStreamReader;
  8import java.io.OutputStream;
  9import java.net.URL;
 10import java.net.URLConnection;
 11import java.util.Date;
 12import java.util.List;
 13import java.util.Map;
 14
 15public class URLConnectionTest {
 16        
 17     public static void main(String[] args) {
 18        
 19         try {
 20             URL url=new URL("http://www.sina.com");
 21             URLConnection con=url.openConnection();
 22             con.connect();
 23             //批量打印出请求头信息
 24             Map<String,List<String>> map=con.getHeaderFields();
 25             for(Map.Entry<String, List<String>> entry:map.entrySet()) {
 26                 String key=entry.getKey();
 27                 for(String value:entry.getValue()) {
 28                     System.out.println(key+"-------------"+value);
 29                 }

 30             }

 31             
 32           
 33           URLConnectionTest test=new URLConnectionTest();
 34           //对字符串"chenxiaoyu"进行  Base64 编码
 35           System.out.println(test.base64Encode("chenxiaoyu"));
 36           
 37           
 38            //按条件打印出相关的请求头信息
 39             System.out.println("------------------");
 40             System.out.println("ContentType():"+con.getContentType());
 41             System.out.println("getContentLength():"+con.getContentLength());
 42             System.out.println("getContentEncoding():"+con.getContentEncoding());
 43             System.out.println("getDate():"+con.getDate());
 44             System.out.println("getLastModified():"+new Date(con.getLastModified()));
 45             System.out.println("------------------");
 46             
 47             //inputStreamReader 是字节到字符的一个桥梁,可以制定字符的字符编码
 48             //下面的方法也是解决网络编程中中文乱码常用的方法
 49             //例如:已知某个response的编码为utf-8
 50             //则要正确显示返回的信息,需要把下面的 gbk 参数换为 utf-8 ,否则会出现乱码或者无法编码的问题
 51             BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream(),"gbk"));
 52             
 53             String s;
 54             //下面的方法打印出新浪网首页的信息
 55             while((s=br.readLine())!=null{
 56                 System.out.println(s);
 57             }

 58             
 59             
 60         }
 catch(Exception e) {
 61             e.printStackTrace();
 62         }

 63         
 64     }

 65     
 66     public  String base64Encode(String s){
 67         OutputStream bao=new ByteArrayOutputStream();
 68         Base64OutputStream b64out=new Base64OutputStream(bao);
 69         try {
 70             b64out.write(s.getBytes());
 71             b64out.flush();
 72             }
 catch(Exception e) {
 73                 e.printStackTrace();
 74             }

 75             return bao.toString();
 76         }

 77         
 78     }

 79     
 80   //下面是一个Base64编码的实现方式,所谓Base64编码是一种加密方式,旨在使人们一眼不能看出信息的真是内容,并不能防止被破解
 81  //采用的是对每24个bit(3个字节)进行编码,方法是按每6个bit位编码成一个字节 则3个字节的真实数据加密后形成4个字节的数据
 82  //(在高两位补0) 每个字节的10进制数据对应固定数组  enconding 的下标 ,如果一个新字节的编码为i则其编码字符为enconding[i]
 83class Base64OutputStream extends FilterOutputStream {
 84    
 85    public Base64OutputStream(OutputStream os) {
 86        super(os);
 87    }

 88    
 89    public void write(int c) throws IOException {
 90        buffer[i]=c;
 91        i++;
 92        if(i==3{
 93            //取第一个字节的前6位又移两位得到一个新的字节
 94            super.write(toBase64[buffer[0]&0xfc>>2]);   
 95            //取第一个字节的后两位左移4位得到第二个新的字节的前两位   然后取第二个字节的前四位右移4位得到第二个新字节的后四位  
 96            //然后将两次取得的bit位用'|'连接起来  得到第二个新的字节
 97            super.write(toBase64[((buffer[0]&0x03)<<4)|((buffer[1])&0xf0>>4)]);
 98        
 99            super.write(toBase64[((buffer[1]&0x0f)<<2)|((buffer[2]&0xc0)>>6)]);
100            super.write(toBase64[(buffer[2]&0x3f)]);
101            col+=4;
102            i=0;
103            if(col>=76{
104                super.write('\n');
105                col=0;
106            }

107            
108        }
        
109         
110    }

111    
112    //如果待编码的字符串不足3个字节,则采用如下方式进行编码
113    public void flush() throws IOException {
114        //如果只有一个字节
115        if(i==1{
116            //第一个新的字节的产生同前
117            super.write(toBase64[buffer[0]&0xfc>>2]);  //base64编码
118            //第二个新字节  取第二个字节的后两位左移4位得到第二个新的字节,由于后面没有待编码的字节,所以在低四补0000
119            //第二个新的字节的二进制形式为  00XX 0000
120            super.write(toBase64[(buffer[0]&0x03)<<4]);
121            //后两个新字节采用连个'='进行补充
122            super.write('=');
123            super.write('=');
124        }

125        //如果只有两个字节
126        else if (i==2{
127            //第一、二个新字节的产生
128            super.write(toBase64[buffer[0]&0xfc]>>2);
129            super.write(toBase64[((buffer[0]&0x03)<<4)|((buffer[1])&0xf0>>4)]);
130            super.write(toBase64[((buffer[1]&0x0f)<<2)]);
131            super.write('=');            
132        }

133    }

134    
135    
136    
137    private static char[] toBase64=
138    {
139     'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
140     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
141     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
142     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
143     }
;
144    
145    private int i=0;
146    
147    private int col=0;
148    
149    private int[] buffer=new int[3];
150    
151    
152    
153}

154
155
156
157
158
159
160
161

posted on 2008-02-22 16:26 晓宇 阅读(210) 评论(0)  编辑  收藏 所属分类: JAVA基础


只有注册用户登录后才能发表评论。


网站导航: