本文實(shí)例講述了Java實(shí)現(xiàn)Socket的TCP傳輸。分享給大家供大家參考。具體分析如下:
客戶端發(fā)數(shù)據(jù)到服務(wù)端
* Tcp傳輸,客戶端建立的過程。
* 1,創(chuàng)建tcp客戶端socket服務(wù)。使用的是Socket對(duì)象。
* 建議該對(duì)象一創(chuàng)建就明確目的地。要連接的主機(jī)。
* 2,如果連接建立成功,說明數(shù)據(jù)傳輸通道已建立。
* 該通道就是socket流 ,是底層建立好的。 既然是流,說明這里既有輸入,又有輸出。
* 想要輸入或者輸出流對(duì)象,可以找Socket來獲取。
* 可以通過getOutputStream(),和getInputStream()來獲取兩個(gè)字節(jié)流。
* 3,使用輸出流,將數(shù)據(jù)寫出。
* 4,關(guān)閉資源。
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
|
package com.socket.tcp.demo; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class ClientDemo { /** * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { //客戶端發(fā)數(shù)據(jù)到服務(wù)端 /* * Tcp傳輸,客戶端建立的過程。 * 1,創(chuàng)建tcp客戶端socket服務(wù)。使用的是Socket對(duì)象。 * 建議該對(duì)象一創(chuàng)建就明確目的地。要連接的主機(jī)。 * 2,如果連接建立成功,說明數(shù)據(jù)傳輸通道已建立。 * 該通道就是socket流 ,是底層建立好的。 既然是流,說明這里既有輸入,又有輸出。 * 想要輸入或者輸出流對(duì)象,可以找Socket來獲取。 * 可以通過getOutputStream(),和getInputStream()來獲取兩個(gè)字節(jié)流。 * 3,使用輸出流,將數(shù)據(jù)寫出。 * 4,關(guān)閉資源。 */ //創(chuàng)建客戶端socket服務(wù)。 //連接目標(biāo)服務(wù)器的地址,192.168.1.100是目標(biāo)服務(wù)器的地址,10002是目標(biāo)服務(wù)器的端口 Socket socket = new Socket( "192.168.1.100" , 10002 ); //獲取socket流中的輸出流。 向服務(wù)器輸出消息,即發(fā)消息到服務(wù)器 OutputStream out = socket.getOutputStream(); //使用輸出流將指定的數(shù)據(jù)寫出去。 out.write( "tcp演示:哥們又來了!" .getBytes()); //關(guān)閉資源。 socket.close(); } } |
服務(wù)端接收客戶端發(fā)送過來的數(shù)據(jù),并打印在控制臺(tái)上。
* 建立tcp服務(wù)端的思路:
* 1,創(chuàng)建服務(wù)端socket服務(wù)。通過ServerSocket對(duì)象。
* 2,服務(wù)端必須對(duì)外提供一個(gè)端口,否則客戶端無法連接。
* 3,獲取連接過來的客戶端對(duì)象。
* 4,通過客戶端對(duì)象獲取socket流讀取客戶端發(fā)來的數(shù)據(jù)
* 并打印在控制臺(tái)上。
* 5,關(guān)閉資源。關(guān)客戶端,關(guān)服務(wù)端。
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
|
package com.socket.tcp.demo; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo { //UDP:發(fā)送端、接收端 (無連接) //TCP:客戶端、服務(wù)端 (要連接)先啟動(dòng)服務(wù)端,在啟動(dòng)客戶端 /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //服務(wù)端接收客戶端發(fā)送過來的數(shù)據(jù),并打印在控制臺(tái)上。 /* * 建立tcp服務(wù)端的思路: * 1,創(chuàng)建服務(wù)端socket服務(wù)。通過ServerSocket對(duì)象。 * 2,服務(wù)端必須對(duì)外提供一個(gè)端口,否則客戶端無法連接。 * 3,獲取連接過來的客戶端對(duì)象。 * 4,通過客戶端對(duì)象獲取socket流讀取客戶端發(fā)來的數(shù)據(jù) * 并打印在控制臺(tái)上。 * 5,關(guān)閉資源。關(guān)客戶端,關(guān)服務(wù)端。 */ //1創(chuàng)建服務(wù)端對(duì)象。 ServerSocket ss = new ServerSocket( 10002 ); //監(jiān)聽?wèi)?yīng)用所在服務(wù)器的10002端口, //看有沒有客戶端連接過來,或者發(fā)送消息 //2,獲取連接過來的客戶端對(duì)象。 Socket s = ss.accept(); //阻塞式. String ip = s.getInetAddress().getHostAddress(); //獲取連接過來客戶端的IP地址 //3,通過socket對(duì)象獲取輸入流,要讀取客戶端發(fā)來的數(shù)據(jù), InputStream in = s.getInputStream(); byte [] buf = new byte [ 1024 ]; int len = in.read(buf); String text = new String(buf, 0 ,len); System.out.println(ip+ ":" +text); s.close(); ss.close(); //關(guān)閉服務(wù)器,理論上是不用關(guān)的 } } |
運(yùn)行效果圖:(先啟動(dòng)服務(wù)端,后啟動(dòng)客戶端)
希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。