要進行網絡編程,首先要搞清楚目的是什麼。java
網絡編程說簡單點就是在網絡上的計算機進行數據的交互。編程
既然要進行數據交互,那就須要有一個發送方和一個接受方。緩存
固然,現階段網上的電腦通常來講都是既接受數據,也能發送數據的,因此說這些電腦都是「插座型」的,進可攻,退可受!!!網絡
好吧,仍是使用專業點的名字吧:客戶端/服務器。socket
那麼具體到兩臺電腦,它們是如何來交互數據的呢?請看下圖:spa
從步驟來分析:code
1、服務器端程序對象
1.1建立一個服務器套接字(ServerSocket),並綁定到指定端口。blog
1.2偵聽來自客戶端的請求,若是接受到鏈接則返回套接字對象(socket)。
1.3得到輸入/輸出流,也就是進行數據的接收或發送。
1.4關閉套接字(socket)。
2、客戶端程序
2.1建立一個套接字,向服務器指定商品發送請求。
2.2與服務器正確鏈接後開始數據的接收或發送。
2.3關閉套接字。
步驟分析完了,接下來就是實施了。
服務器端代碼以下:
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
|
public
class
MyServer {
private
static
final
int
SERVER_PORT =
9527
;
// 指定偵聽端口
public
MyServer() {
try
{
ServerSocket ss =
new
ServerSocket(SERVER_PORT);
// 建立服務器套接字
System.out.println(
"服務端已啓動,正在等待客戶端..."
);
Socket s = ss.accept();
// 偵聽來自客戶端的請求
InputStream in = s.getInputStream();
// 得到輸入流,用來接收數據
OutputStream out = s.getOutputStream();
// 得到輸出流,用來發送數據
byte
[] buf =
new
byte
[
1024
];
// 數據緩存
int
len = in.read(buf);
// 從輸入流中讀取數據
String strFromClient =
new
String(buf,
0
, len);
System.out.print(
"來自客戶端的信息>>"
);
System.out.println(strFromClient);
String strToClient =
"我也很好!"
;
out.write(strToClient.getBytes());
// 往輸出流中發送數據
// 關閉輸入流和輸出流
in.close();
out.close();
// 關閉通訊套接字和服務器套接字
s.close();
ss.close();
System.out.println(
"服務端已關閉。"
);
}
catch
(IOException e) {
e.printStackTrace();
}
}
public
static
void
main(String[] args) {
MyServer ms =
new
MyServer();
}
}
|
客戶端代碼以下:
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
|
public
class
MyClient {
private
static
final
int
SERVER_PORT =
9527
;
//服務器的偵聽端口
public
MyClient() {
try
{
//因爲服務端也是運行在本機,因此建立本機的InetAddress對象
InetAddress address = InetAddress.getByName(
"localhost"
);
Socket s =
new
Socket(address, SERVER_PORT);
//向服務器偵聽端口發出請求
System.out.println(
"客戶端已啓動。"
);
InputStream in = s.getInputStream();
//得到輸入流,用來接收數據
OutputStream out = s.getOutputStream();
//得到輸出流,用來發送數據
String strToServer =
"你好!"
;
out.write(strToServer.getBytes());
//往輸出流中發送數據
byte
[] buf =
new
byte
[
1024
];
int
len = in.read(buf);
//從輸入流中讀取數據
String strFromServer =
new
String(buf,
0
, len);
System.out.print(
"來自服務端的回答>>"
);
System.out.println(strFromServer);
in.close();out.close();
//關閉輸入流和輸出流
s.close();
//關閉通訊套接字
System.out.println(
"客戶端已關閉。"
);
}
catch
(UnknownHostException nhe) {
System.out.println(
"未找到指定主機..."
);
}
catch
(IOException ioe) {
ioe.printStackTrace();
}
}
public
static
void
main(String[] args) {
MyClient mc =
new
MyClient();
}
}
|
先運行服務器端
再運行客戶端,能夠發現服務器端的內容發生了變化
再切換到客戶端的輸出窗口
客戶端的輸出內容以下:
有興趣的看官能夠修改代碼,讓它變成能夠從控制檯反覆輸入文字來交互。研究得更深些的朋友,能夠嘗試發送文件。