java版本的飛鴿編寫(二)
上篇講到了,接收到了廣播包,應該如何去做
因為不知道使用者什麼時候傳送廣播包
所以也要用個執行緒來不斷的監聽廣播埠
當收到一個請求包後,將自己的資訊反饋給傳送者
現在就講使用者如何傳送廣播包
我定義了一個傳送訊息的一個類(Sendmes)
這個類有兩個構造方法
預設的構造方法傳送廣播包
有引數的構造方法Sendmes(byte[] ip,byte data[])
其中IP表示接收者的IP地址,data表示將要傳送的資料
原始碼如下
//用來發送簡訊息
//埠9001為資訊傳送埠
//埠9000為資訊接收埠
//埠8888為廣播發送埠
//埠8889為廣播接收埠
//預設構造方法是傳送廣播包
import java.net.*;
import java.io.*;
class Sendmes{
DatagramSocket trans;
DatagramPacket udpmess;
InetAddress addre;
byte[] ip= new byte[4]; //儲存接收方的IP地址
byte[] data=new byte[300];//儲存使用者傳送的資訊,最大資訊長度為300位元組
byte[] data1={1,1,1,1,1}; //傳送廣播包裡的資訊為全"1"
Sendmes(){
try{
trans= new DatagramSocket(8880);
}catch(SocketException e){
System.out.println ("無法開啟埠");
new Newmess("無法開啟埠");
}
try{
addre=InetAddress.getLocalHost();
ip=Convert(addre.getHostAddress()); //獲取自己所在區域網的IP,好自適應形成對應的廣播地址
switch(ip[0]) //自適應過程
{
case 10: ip[1]=(byte)255;
ip[2]=(byte)255;
ip[3]=(byte)255;
break;
case (byte)172:ip[2]=(byte)255;
ip[3]=(byte)255;
break;
case (byte)192:ip[2]=(byte)255;
ip[3]=(byte)255;
break;
}
addre= InetAddress.getByAddress(ip);
}catch(UnknownHostException e){
System.out.println ("找不到目的主機");
new Newmess("找不到目的主機");
}
udpmess = new DatagramPacket(data1,5,addre,8889);
try{
trans.send(udpmess); //傳送訊息
}catch(IOException e){
System.out.println ("資料傳輸錯誤");
System.out.println (e.getMessage());
}
trans.close();
}
//引數ip為接收方的IP地址,data為傳送的資料
//從本機的9001端口出去,傳送到目的方的9000埠
Sendmes(byte[] ip,byte data[]){
this.ip=ip;
this.data=data;
try{
trans= new DatagramSocket(9001);
}catch(SocketException e){
System.out.println ("無法開啟埠");
}
try{
addre= InetAddress.getByAddress(ip);
}catch(UnknownHostException e){
System.out.println ("找不到目的主機");
}
udpmess = new DatagramPacket(data,data.length,addre,9000);
try{
trans.send(udpmess);
}catch(IOException e){
System.out.println ("資料傳輸錯誤");
}
trans.close();
}
byte[] Convert(String temp){ //將IP地址轉換為byte[]數組裡面去
byte[] b=new byte[4];
int i,j,k;
for(i=0,j=0,k=0;i<temp.length();i++){
if(temp.charAt(i)=='.'){
b[k++]=(byte)Integer.parseInt(temp.substring(j,i));
j=i+1;
}
if(k==3) break;
}
b[k]=(byte)Integer.parseInt(temp.substring(j,temp.length()));
return b;
}
}
下一貼我們講介紹
如何根據廣播包後收到的反饋資訊
形成相應的圖形化介面