1. 程式人生 > >java版本的飛鴿編寫(二)

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;
    }
 
  
}

下一貼我們講介紹

如何根據廣播包後收到的反饋資訊

形成相應的圖形化介面