Android 通過局域網udp廣播自動建立socket連接


Android開發中經常會用到socket通訊。由於項目需要,最近研究了一下這方面的知識。 需求是想通過wifi實現android移動設備和android平台的電視之間的文件傳輸與控制。 毫無疑問這中間一定需要用到socket來進行通信。今天就兩台設備的握手連接方式分享一下吧,該方法只是本人個人想法的實現,僅供參考,如有雷同,不勝榮幸。

   要想使用socket進行通訊,就必須知道服務端的IP地址,我使用的是通過udp局網廣播來實現局網內服務端的搜尋建立連接。以下是代碼實現。

   首先是客戶端:   

public class MainActivity extends Activity {
    /*發送廣播端的socket*/
    private MulticastSocket ms;
    /*發送廣播的按鈕*/
    private Button sendUDPBrocast;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }
    
    /*初始化參數*/
    public void init() {
        setContentView(R.layout.main);
        sendUDPBrocast = (Button) findViewById(R.id.send);
        sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener());
        try {
            /*創建socket實例*/
            ms = new MulticastSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 單擊按鈕時,發送局域網廣播
     * */
    class SendUDPBrocastListener implements OnClickListener{
        
        @Override
        public void onClick(View v) {
            //發送的數據包,局網內的所有地址都可以收到該數據包
            DatagramPacket dataPacket = null;
            try {
                ms.setTimeToLive(4);
                //將本機的IP(這里可以寫動態獲取的IP)地址放到數據包里,其實server端接收到數據包后也能獲取到發包方的IP的
                byte[] data = "192.168.1.101".getBytes();
                //224.0.0.1為廣播地址
                InetAddress address = InetAddress.getByName("224.0.0.1");
                //這個地方可以輸出判斷該地址是不是廣播類型的地址
                System.out.println(address.isMulticastAddress());
                dataPacket = new DatagramPacket(data, data.length, address,
                        8003);
                ms.send(dataPacket);
                ms.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

以下是服務端:

public class MainActivity extends Activity implements Runnable {
    private MulticastSocket ds;
    String multicastHost="224.0.0.1";
    InetAddress receiveAddress;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
            ds = new MulticastSocket(8003);
            receiveAddress=InetAddress.getByName(multicastHost);
            ds.joinGroup(receiveAddress);
            new Thread(this).start();
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        byte buf[] = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, 1024);
        while (true) {
            try {
                ds.receive(dp);
                //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG);
                System.out.println("client ip : "+new String(buf, 0, dp.getLength()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 這樣一來如果移動設備所連接的局網內存在socket的服務端,服務端就會接收到客戶端發出的廣播,然后服務端再通過接收到的IP與客戶端進行連接進而就可以進行控制及文件的傳輸了。需要注意的是,udp廣播會導致局網傳輸速度變慢,而且udp為不可靠協議,發出的廣播服務端不一定都能夠收到,所以在實際情況中需要做很多邏輯處理,比如在線程里發廣播直到收到服務端的回應 但如果局網內不存在服務端就會陷入死循環,所以這時就要做限時操作了等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM