csusky
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
AJAX
(rss)
HIBERNATE(1)
(rss)
J2EE(3)
(rss)
JAVA基础(8)
(rss)
JAVA非阻塞编程(2)
(rss)
JDBC(2)
(rss)
LUCENE(13)
(rss)
NOTE(1)
(rss)
ORACLE(1)
(rss)
PL/SQL
(rss)
SPRING
(rss)
STRUTS
(rss)
随笔档案
2009年11月 (1)
2008年12月 (1)
2008年11月 (2)
2008年10月 (1)
2008年5月 (4)
2008年4月 (11)
2008年3月 (2)
2008年2月 (10)
阅读排行榜
1. JDBC中的连接方式 thin模式 和 DataSource方式(3703)
2. SPRING整合IBMMQ实现全局事物(2405)
3. TREEMAP的排序机制(2092)
4. JMS基础(2085)
5. ORACLE的块大小(1757)
评论排行榜
1. Lucene的切词 analysis包(1)
2. 异步IO的关闭事件(1)
3. TREEMAP的排序机制(1)
4. JDBC中的批处理(1)
5. JMS基础(1)
常用链接
我的随笔
我的评论
我的参与
最新评论
统计
随笔 - 32
文章 - 0
评论 - 5
引用 - 0
最新评论
1. re: TREEMAP的排序机制[未登录]
不错,不错!
--xxx
2. re: 异步IO的关闭事件
好文,帮助很大,就是如何判断通道关闭了
--daimojingdeyu
3. re: Lucene的切词 analysis包
强,真是我需要的
--啊啊啊
4. re: JMS基础
不错,谢谢共享
--hushuili
5. re: JDBC中的批处理
ddddddddd
--反反复复
SOCKET基础 学习笔记
1
package
com;
2
3
import
java.io.BufferedReader;
4
import
java.io.ByteArrayOutputStream;
5
import
java.io.FilterOutputStream;
6
import
java.io.IOException;
7
import
java.io.InputStreamReader;
8
import
java.io.OutputStream;
9
import
java.net.URL;
10
import
java.net.URLConnection;
11
import
java.util.Date;
12
import
java.util.List;
13
import
java.util.Map;
14
15
public
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]
83
class
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
晓宇
阅读(230)
评论(0)
编辑
收藏
所属分类:
JAVA基础
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
JDK1.5的自动装箱功能
数据库的事务 JDBC
字符串池
JAVA中的异常处理
JAVA 的字符编码的问题
SOCKET基础 学习笔记
字节数组和其他类型的转换
TREEMAP的排序机制
Powered by:
BlogJava
Copyright © 晓宇