tcp實現(xiàn)
tcp協(xié)議需要在雙方之間建立連接,通過輸入輸出流來進(jìn)行數(shù)據(jù)的交換,建立需要通過三次握手,斷開需要四次揮手,保證了數(shù)據(jù)的完整性,但傳輸效率也會相應(yīng)的降低。
簡單的tcp實現(xià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
|
//服務(wù)端 public class tcpserver { public static void main(string[] args) throws ioexception { serversocket serversocket = new serversocket( 8886 ); // 建立服務(wù)端,ip為本機(jī)ip,端口為8886 socket accept = serversocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應(yīng)的accept inputstream in = accept.getinputstream(); //獲取到客戶端的輸出流 byte b[] = new byte [ 1024 ]; int len = in.read(b); system.out.println( "接受到客戶端數(shù)據(jù),返回數(shù)據(jù)" + new string(b, 0 ,len)); outputstream out = accept.getoutputstream(); // 給客戶端發(fā)送消息 out.write( "服務(wù)端已經(jīng)接受" .getbytes()); serversocket.close(); } } // 客戶端 public class tcpclient { public static void main(string[] args) throws ioexception { socket socket = new socket( "127.0.0.1" , 8886 ); // 通過socket來建立和服務(wù)端的連接 outputstream out = socket.getoutputstream(); // 獲取輸出流(客戶端輸出流即向服務(wù)端輸出信息) out.write( "hello tcp server" .getbytes()); // 輸出信息 inputstream in = socket.getinputstream(); // 接受服務(wù)端的消息 byte b[] = new byte [ 1024 ]; int len = in.read(b); system.out.println( "接受到服務(wù)器消息 : " + new string(b, 0 ,len)); // 輸出 out.write( "返回的的數(shù)據(jù)已經(jīng)收到 " .getbytes()); // 向服務(wù)器返回消息 socket.close(); } } |
改進(jìn)服務(wù)端,啟用多線程來接受客戶端的數(shù)據(jù)
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 ); // 建立服務(wù)端,ip為本機(jī)ip,端口為8886 int i= 4 ; while (i> 2 ){ socket accept = serversocket.accept(); // 監(jiān)聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應(yīng)的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( "接受到客戶端數(shù)據(jù),返回數(shù)據(jù)" + new string(b, 0 , len)); outputstream out = accept.getoutputstream(); // 給客戶端發(fā)送消息 out.write( "服務(wù)端已經(jīng)接受" .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
|
// 服務(wù)端 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(); // 別忘了刷新,要不然最后一塊緩沖區(qū)字符串會缺失 } 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(); // 刷新緩沖區(qū) 要不然最后一塊緩沖區(qū)字符串會缺失 } socket.shutdownoutput(); // 關(guān)閉流以后server段才會接收道結(jié)束字符結(jié)束接受 bufferedreader br = new bufferedreader( new inputstreamreader(socket.getinputstream())); string line; while ((line = br.readline()) != null ) { system.out.println(line); } in.close(); socket.close(); } } |
udp實現(xiàn)
udp是將數(shù)據(jù)打成數(shù)據(jù)包向?qū)Ψ桨l(fā)送,只關(guān)系是否發(fā)送成功,而不關(guān)心是否接收成功,傳輸速度快,但是可靠性低。
udp代碼實現(xià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
36
37
38
39
|
// 發(fā)送端 public class senddemo { public static void main(string[] args) throws ioexception { datagramsocket ds = new datagramsocket(); // 此類表示用來發(fā)送和接收數(shù)據(jù)報包的套接字。 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 ); // 數(shù)據(jù)包對象 ds.send(dp); if ( "886" .equals(line)) { // 當(dāng)輸入886時結(jié)束發(fā)送 break ; } } ds.close(); } } // 接收端 public class recivedemo { public static void main(string[] args) throws ioexception { datagramsocket ds = new datagramsocket( 10005 ); // 建立服務(wù)端 byte bytes[] = new byte [ 1024 ]; datagrampacket dp = new datagrampacket(bytes, bytes.length); // 建立數(shù)據(jù)包對象 while ( true ) { ds.receive(dp); // 接受數(shù)據(jù)包 byte [] data = dp.getdata(); // 獲取數(shù)據(jù) string str = new string(data, 0 , dp.getlength()); if ( "886" .equals(str)) { break ; } system.out.println(str); } ds.close(); } } |
以上這篇java簡單實現(xiàn)udp和tcp的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/liyuhui-Z/p/7794829.html