服務端客戶端
伺服器端接收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 就是伺服器端的資訊,相當於之前的devicesn: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...