需求:應(yīng)用a(通常有多個(gè))和應(yīng)用b(1個(gè))進(jìn)行 socket通訊,應(yīng)用a必須知道應(yīng)用b的ip地址(在應(yīng)用a的配置文件中寫死的),這個(gè)時(shí)候就必須把應(yīng)用b的ip設(shè)成固定ip(但是某些時(shí)候如更換路由后要重新設(shè)置網(wǎng)絡(luò),但是操作人員不知道這個(gè)規(guī)則),就有可能造成應(yīng)用a和應(yīng)用b無法進(jìn)行正常通訊,所以要改成應(yīng)用a動態(tài)獲取應(yīng)用b的ip地址。
經(jīng)過討論決定采用udp協(xié)議實(shí)現(xiàn),upd是一種無連接的傳輸層協(xié)議。應(yīng)用a在不知道應(yīng)用b的 ip情況下 可以使用廣播地址255.255.255.255,將消息發(fā)送到在同一廣播網(wǎng)絡(luò)上的b。從而獲取b的ip。
實(shí)現(xiàn)代碼:
b應(yīng)用為服務(wù)端:將udp監(jiān)聽放到一個(gè)線程中,當(dāng)有客戶端請求時(shí)就會進(jìn)行響應(yīng)
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
|
/** * udp連接,用于動態(tài)ip, pos向255.255.255.255:5060發(fā)送請求即可 * **/ public class udpserver extends thread implements runnable { private final int max_length = 1024 ; private final int port = 5060 ; private datagramsocket datagramsocket; public void run() { try { init(); while ( true ){ try { byte [] buffer = new byte [max_length]; datagrampacket packet = new datagrampacket(buffer, buffer.length); receive(packet); string recestr = new string(packet.getdata(), 0 , packet.getlength()); system.out.println( "接收數(shù)據(jù)包" + recestr); byte [] bt = new byte [packet.getlength()]; system.arraycopy(packet.getdata(), 0 , bt, 0 , packet.getlength()); system.out.println(packet.getaddress().gethostaddress() + ":" + packet.getport() + ":" + arrays.tostring(bt)); packet.setdata(bt); response(packet); } catch (exception e) { e.printstacktrace(); loggerutil.error( "udp線程出現(xiàn)異常:" + e.tostring()); } } } catch (exception e) { e.printstacktrace(); } } public void receive(datagrampacket packet) throws exception { datagramsocket.receive(packet); } public void response(datagrampacket packet) throws exception { datagramsocket.send(packet); } /** * 初始化連接 */ public void init(){ try { datagramsocket = new datagramsocket(port); system.out.println( "udp服務(wù)端已經(jīng)啟動!" ); } catch (exception e) { datagramsocket = null ; system.out.println( "udp服務(wù)端啟動失敗!" ); e.printstacktrace(); } } } |
客戶端:本來客戶端是使用pb來實(shí)現(xiàn)的,但是這里使用java來模擬
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
|
/*** * udp client端 ***/ public class udpclient { private string sendstr = "hello" ; private string netaddress = "255.255.255.255" ; private final int port = 5060 ; private datagramsocket datagramsocket; private datagrampacket datagrampacket; public udpclient(){ try { datagramsocket = new datagramsocket(); byte [] buf = sendstr.getbytes(); inetaddress address = inetaddress.getbyname(netaddress); datagrampacket = new datagrampacket(buf, buf.length, address, port); datagramsocket.send(datagrampacket); byte [] recebuf = new byte [ 1024 ]; datagrampacket recepacket = new datagrampacket(recebuf, recebuf.length); datagramsocket.receive(recepacket); string recestr = new string(recepacket.getdata(), 0 , recepacket.getlength()); //獲取服務(wù)端ip string serverip = recepacket.getadress(); } catch (socketexception e) { e.printstacktrace(); } catch (unknownhostexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally { // 關(guān)閉socket if (datagramsocket != null ){ datagramsocket.close(); } } } public static void main(string[] args) { for ( int i = 0 ; i < 100 ; i++) { new thread( new runnable() { @override public void run() { udpclient udpclient = new udpclient(); } }).start(); } } } |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/coderising/p/9689619.html