Android 通過區域網路udp廣播自動建立socket串連

來源:互聯網
上載者:User

標籤:可靠   線上   ack   ast   接收   .net   服務端   runnable   layout   

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為不可靠協議,發出的廣播服務端不一定都能夠收到,所以在實際情況中需要做很多邏輯處理,比如線上程裡發廣播直到收到服務端的回應 但如果局網內不存在服務端就會陷入死迴圈,所以這時就要做限時操作了等等

Android 通過區域網路udp廣播自動建立socket串連

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.