Socket又称套接字,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
在Java中,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的对话。对于一个网络连接来说,套接字是平等的,并没有差别,不应为在服务器端或者在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。
Socket链接的建立过程:
-
服务器监听(SocketServer监听某个端口,阻塞线程,等待客户端访问这个端口,当有请求访问该端口,解除阻塞,accept()方法返回一个socket对象)
-
客户端发出请求(Socket(string ip, int port)客户端创建socket对象,连接服务器该端口)
-
建立链接 (客户端请求该端口,被服务器监听到,两个相对的socket相关联)
-
通信(客户端socket写入信息到输出流,则服务端的socket可以从输入流中读取,反则亦然)
Socket的特点:
-
Socket基于TCP协议,数据传输有保障
-
Socket适用于建立长时间链接
-
Socket编程通常应用于即时通讯
实例代码:使用JFrame实现一个简单聊天室
Eclipse安装WindowBuilder插件,可以实现拖拽控件的形式生成swing代码,
WindowBuilder插件安装地址:http://www.eclipse.org/windowbuilder/download.php
-
Eclipse (Mars版):http://download.eclipse.org/windowbuilder/WB/release/R201506241200-1/4.5/
点击Eclipse的功能栏的help-》install new software -》点击add按钮,填写上方1的url到Location中,完成安装。
客户端核心代码:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
public
class
ChatManager {
private
ChatManager(){}
private
static
final
ChatManager instance =
new
ChatManager();
public
static
ChatManager getCM() {
return
instance;
}
MainWIndow window;
Socket socket;
BufferedReader reader;
PrintWriter writer;
public
void
setWindow(MainWIndow window) {
this
.window = window;
window.appendText(
"文本框已经和ChatManager绑定了。"
);
}
public
void
connect(String ip) {
new
Thread(){
@Override
public
void
run() {
try
{
socket =
new
Socket(ip,
12345
);
writer =
new
PrintWriter(
new
OutputStreamWriter(
socket.getOutputStream()));
reader =
new
BufferedReader(
new
InputStreamReader(
socket.getInputStream()));
String line;
while
((line = reader.readLine()) !=
null
) {
window.appendText(
"收到:"
+line);
}
writer.close();
reader.close();
writer =
null
;
reader =
null
;
}
catch
(UnknownHostException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}.start();
}
public
void
send(String out) {
if
(writer !=
null
) {
writer.write(out+
"\n"
);
writer.flush();
}
else
{
window.appendText(
"当前的链接已经中断"
);
}
}
}
|
服务器端核心代码:
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
|
public
class
ChatManager {
private
ChatManager(){}
private
static
final
ChatManager cm =
new
ChatManager();
public
static
ChatManager getChatManager() {
return
cm;
}
Vector<ChatSocket> vector =
new
Vector<ChatSocket>();
public
void
add(ChatSocket cs) {
vector.add(cs);
}
public
void
remove(ChatSocket cs) {
vector.remove(cs);
}
public
void
publish(ChatSocket cs,String out) {
for
(
int
i =
0
; i < vector.size(); i++) {
ChatSocket csChatSocket = vector.get(i);
if
(!cs.equals(csChatSocket)) {
csChatSocket.out(out);
}
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
ServerListener
extends
Thread {
@Override
public
void
run() {
try
{
ServerSocket serverSocket =
new
ServerSocket(
12345
);
while
(
true
) {
//block
Socket socket = serverSocket.accept();
ChatSocket cs =
new
ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
|