UDP搜尋IP與埠

2021-10-24 19:00:56 字數 4581 閱讀 3345

服務端客戶端

伺服器端接收tcp的埠號 30401

public

class

tcpconstants

服務端接收udp的埠號 30201

客戶端接收udp的埠號 30202

public

class

udpconstants

;public

static

int port_server =

30201

;public

static

int port_client_response =

30202

;}

public

class

byteutils

public

static

boolean

startswith

(byte

source,

int offset,

byte

match)

for(

int i =

0; i < match.length; i++)}

return

true;}

}

server最主要的操作就是:serverprovider.start(tcpconstants.port_server);

public

class

server

catch

(idexception e)

//讀取任意位元組後,結束

serverprovider.

stop()

;}}

class

serverprovider

static

void

stop()

}private

static

class

provider

extends

thread

}

靜態內部類provider,繼承自乙個執行緒。作為服務端,用來接收和傳送udp資料。

provider(string sn, int port):構造方法傳入:tcp埠 和 乙個唯一的uuid-sn

run():接收udp資料,驗證資料,提取客戶端的udp埠號,傳送自己的tcp埠號

close():關閉udp資料的接收和傳送,即 關閉datagramsocket ds

exit():退出迴圈監聽,即 使得done = true,同時呼叫close()方法,關閉ds

private

static

class

provider

extends

thread

@override

public

void

run(

)//解析命令與回送埠

int index = udpconstants.header.length;

short cmd =

(short)(

(clientdata[index++

]<<8)

|(clentdata[index++]&

0xff))

;int responseport = clientdata[index++

]<<24|

(clientdata[index++]&

0xff

)<<16|

(clientdata[index++]&

0xff

)<<8|

(clientdata[index++]&

0xff);

if(cmd ==

1&& responseport >0)

else}}

catch

(exception ignored)

finally

system.out.

println

("u***rovider finished.");

}void

close()

}void

exit()

}

serverinfo 就是伺服器端的資訊,相當於之前的device

sn:uuid

port:tcp的埠 30401

address:服務端的ip

public

class

serverinfo

//...getter,setter

}

對應服務端的server,裡面主要有乙個語句,就是開啟 搜尋伺服器並返回伺服器資訊,最多查詢10s

public

class

client

}

目的是:傳送udp廣播,並告訴服務端自己監聽的udp埠30202。主要有3步:

public

class

clientsearcher

catch

(exception e)

system.out.

println

("udpsearcher finished!");

//因為listen()方法也可能被打斷,所以listener也有可能是空的

if(listener == null)

list

lists = listener.

getserverinfo()

;if(lists.

size()

>0)

return lists.

get(0)

;return null;

}private

static listener listen

(countdownlatch receivelatch)

throws interruptedexception

private

static

void

sendbroadcast()

throws ioexception

private

static

class

listener

extends

thread

}

private

static

class

listener

extends

thread

@override

public

void

run(

) bytebuffer bytebuffer = bytebuffer.

wrap

(buffer,udpconstants.header.length,datalen-udpconstants.header.length)

;final

short cmd = bytebuffer.

getshort()

;final

int serverport = bytebuffer.

getint()

;if(cmd !=

2|| serverport <=0)

system.out.

println

("udpsearcher receive cmd:"

+ cmd +

"\tserverport:"

+ serverport)

;continue;}

string sn =

newstring

(buffer, minlen, datalen - minlen)

; serverinfo info =

newserverinfo

(serverport,ip,sn)

; serverinfolist.

add(info)

; receivelatch.

countdown()

;}}catch

(exception ignored)

finally

system.out.

println

("udpsearcher listener finished.");

}private

void

close()

} list

getserverinfo()

}

ip位址與埠 基礎篇

主要學習類 ipaddress,iphostentry,ipendpoint,system.net 客戶端與伺服器相互通訊,其實真正相互完成通訊的不是兩台計算機,而是兩台計算機上的程序。ip僅僅能夠具體到某台主機,再通過埠連線到該主機程序。ipaddress類提供了對ip位址的轉換,處理等功能。該類...

vue動態配置ip與埠

考慮乙個成品的專案會給到各地方進行部署,而每個地方的ip和埠均無法保證統一,為了抽離開發人員的工作,需要對專案進行一定的配置,配置後的專案,只需要修改打包後的配置檔案,填寫相關的ip和埠,即可實現專案的部署。由於vue打包後會生成static包 index檔案,為了防止打包後混淆,可以在專案的sta...

怎樣測試UDP埠

這種測試方法很簡單,不需要用什麼測試工具!轉於 下面我們來進行測試,123埠是伺服器42.11.12.13開啟的udp埠,udp 0 0 42.11.12.13 123 0.0.0.0 1472 ntpd 1 我們首先使用telnet連線,如下 root kr sg test telnet 42.1...