tcp實現
tcp協議需要在雙方之間建立連接,通過輸入輸出流來進行數據的交換,建立需要通過三次握手,斷開需要四次揮手,保證了數據的完整性,但傳輸效率也會相應的降低。
簡單的tcp實現
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 tcpserver { public static void main(string[] args) throws ioexception { serversocket serversocket = new serversocket( 8886 ); // 建立服務端,ip為本機ip,端口為8886 socket accept = serversocket.accept(); // 監聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應的accept inputstream in = accept.getinputstream(); //獲取到客戶端的輸出流 byte b[] = new byte [ 1024 ]; int len = in.read(b); system.out.println( "接受到客戶端數據,返回數據" + new string(b, 0 ,len)); outputstream out = accept.getoutputstream(); // 給客戶端發送消息 out.write( "服務端已經接受" .getbytes()); serversocket.close(); } } // 客戶端 public class tcpclient { public static void main(string[] args) throws ioexception { socket socket = new socket( "127.0.0.1" , 8886 ); // 通過socket來建立和服務端的連接 outputstream out = socket.getoutputstream(); // 獲取輸出流(客戶端輸出流即向服務端輸出信息) out.write( "hello tcp server" .getbytes()); // 輸出信息 inputstream in = socket.getinputstream(); // 接受服務端的消息 byte b[] = new byte [ 1024 ]; int len = in.read(b); system.out.println( "接受到服務器消息 : " + new string(b, 0 ,len)); // 輸出 out.write( "返回的的數據已經收到 " .getbytes()); // 向服務器返回消息 socket.close(); } } |
改進服務端,啟用多線程來接受客戶端的數據
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
|
// server public static void main(string[] args) throws ioexception { serversocket serversocket = new serversocket( 8886 ); // 建立服務端,ip為本機ip,端口為8886 int i= 4 ; while (i> 2 ){ socket accept = serversocket.accept(); // 監聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應的accept serverthread st = new serverthread(accept); // 啟動線程 thread th = new thread(st); th.start(); } serversocket.close(); } // thread public class serverthread implements runnable { private socket accept; public serverthread(socket s) { this .accept = s; } public void run(){ inputstream in; try { in = accept.getinputstream(); byte b[] = new byte [ 1024 ]; int len = in.read(b); system.out.println( "接受到客戶端數據,返回數據" + new string(b, 0 , len)); outputstream out = accept.getoutputstream(); // 給客戶端發送消息 out.write( "服務端已經接受" .getbytes()); } catch (ioexception e) { e.printstacktrace(); } } } |
傳遞圖片
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
60
61
62
|
// 服務端 public class server { public static void main(string[] args) throws ioexception { serversocket serversocket = new serversocket( 5555 ); socket ss = serversocket.accept(); bufferedinputstream br = new bufferedinputstream(ss.getinputstream()); bufferedoutputstream bw = new bufferedoutputstream( new fileoutputstream( "copy.jpg" )); // 寫出文件流 byte b[] = new byte [ 1024 ]; int len = 0 ; while ((len = br.read(b)) != - 1 ) { // 寫出文件 bw.write(b, 0 , len); bw.flush(); // 別忘了刷新,要不然最后一塊緩沖區字符串會缺失 } bufferedwriter bw2 = new bufferedwriter( new outputstreamwriter(ss.getoutputstream())); // 輸出 bw2.write( "圖片傳輸成功" ); bw2.flush(); bw.close(); ss.close(); } } // 客戶端 public class client { public static void main(string[] args) throws unknownhostexception, ioexception { socket socket = new socket( "127.0.0.1" , 5555 ); bufferedinputstream in = new bufferedinputstream( new fileinputstream( "c.jpg" )); bufferedoutputstream out = new bufferedoutputstream(socket.getoutputstream()); byte b[] = new byte [ 1024 ]; int len = 0 ; while ((len = in.read(b)) != - 1 ) { out.write(b, 0 , len); out.flush(); // 刷新緩沖區 要不然最后一塊緩沖區字符串會缺失 } socket.shutdownoutput(); // 關閉流以后server段才會接收道結束字符結束接受 bufferedreader br = new bufferedreader( new inputstreamreader(socket.getinputstream())); string line; while ((line = br.readline()) != null ) { system.out.println(line); } in.close(); socket.close(); } } |
udp實現
udp是將數據打成數據包向對方發送,只關系是否發送成功,而不關心是否接收成功,傳輸速度快,但是可靠性低。
udp代碼實現
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
|
// 發送端 public class senddemo { public static void main(string[] args) throws ioexception { datagramsocket ds = new datagramsocket(); // 此類表示用來發送和接收數據報包的套接字。 bufferedreader br = new bufferedreader( new inputstreamreader(system.in)); // 鍵盤輸入 string line = null ; while ((line = br.readline()) != null ) { byte [] bytes = line.getbytes(); datagrampacket dp = new datagrampacket(bytes, bytes.length, inetaddress.getbyname( "127.0.0.1" ), 10005 ); // 數據包對象 ds.send(dp); if ( "886" .equals(line)) { // 當輸入886時結束發送 break ; } } ds.close(); } } // 接收端 public class recivedemo { public static void main(string[] args) throws ioexception { datagramsocket ds = new datagramsocket( 10005 ); // 建立服務端 byte bytes[] = new byte [ 1024 ]; datagrampacket dp = new datagrampacket(bytes, bytes.length); // 建立數據包對象 while ( true ) { ds.receive(dp); // 接受數據包 byte [] data = dp.getdata(); // 獲取數據 string str = new string(data, 0 , dp.getlength()); if ( "886" .equals(str)) { break ; } system.out.println(str); } ds.close(); } } |
以上這篇java簡單實現udp和tcp的示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/liyuhui-Z/p/7794829.html