Socket通信入門之基于UDP

上一篇的兄弟篇
上一篇地址:http://www.itdecent.cn/p/457b24e5e0a5

基于UDP

UDP協(xié)議以數(shù)據(jù)包作為數(shù)據(jù)傳輸?shù)妮d體,也就是在數(shù)據(jù)傳輸時,我們需要將數(shù)據(jù)包裝成數(shù)據(jù)報,在數(shù)據(jù)報中指明目的主機(jī)地址和端口號,然后將數(shù)據(jù)報發(fā)出去,用到了兩個關(guān)鍵類:

  • DatagramPacket 數(shù)據(jù)報包
  • DatagramSocket 進(jìn)行端到端通信的類

服務(wù)器

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            @Override
            public void run() {
                try {
                    //步驟①創(chuàng)建服務(wù)器端DatagramSocket,指定端口

                    DatagramSocket socket = new DatagramSocket(8899);
                    //步驟②創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)
                    byte[] data =new byte[1024];//創(chuàng)建字節(jié)數(shù)組,指定接收的數(shù)據(jù)包的大小
                    DatagramPacket packet=new DatagramPacket(data, data.length);
                    //步驟③接收客戶端發(fā)送的數(shù)據(jù)
                    System.out.println("server loaded success,waiting...");
                    socket.receive(packet);//此方法在接收到數(shù)據(jù)報之前會一直阻塞
                    //步驟④讀取數(shù)據(jù)
                    String info=new String(data, 0, packet.getLength());
                    //為了簡單起見,這里就不再寫驗證的邏輯了

                    //步驟⑤定義客戶端的地址、端口號、數(shù)據(jù)
                    InetAddress address=packet.getAddress();
                    int port=packet.getPort();
                    byte[] data2="Welcome!!!".getBytes();
                    //步驟⑥創(chuàng)建數(shù)據(jù)報,包含響應(yīng)的數(shù)據(jù)信息
                    DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
                    //步驟⑦響應(yīng)客戶端
                    socket.send(packet2);
                    //步驟⑧關(guān)閉資源
                    socket.close();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();


    }
}

客戶端

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            @Override
            public void run() {
                //步驟①定義服務(wù)器的地址、端口號、數(shù)據(jù)
                InetAddress address= null;
                try {
                    address = InetAddress.getByName("localhost");
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                int port=8899;
                byte[] data="admin:123".getBytes();
                //步驟②創(chuàng)建數(shù)據(jù)報,包含發(fā)送的數(shù)據(jù)信息
                DatagramPacket packet=new DatagramPacket(data, data.length, address, port);

                try {
                    //步驟③創(chuàng)建DatagramSocket對象
                    DatagramSocket socket = new DatagramSocket();
                    //步驟④向服務(wù)器端發(fā)送數(shù)據(jù)報
                    socket.send(packet);
                    //步驟⑤創(chuàng)建數(shù)據(jù)報,用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
                    byte[] data2=new byte[1024];
                    DatagramPacket packet2=new DatagramPacket(data2, data2.length);
                    //步驟⑥接收服務(wù)器響應(yīng)的數(shù)據(jù)
                    socket.receive(packet2);
                    //步驟⑦讀取數(shù)據(jù)
                    String reply=new String(data2, 0, packet2.getLength());
                    System.out.println("server reply : "+reply);
                    //步驟⑧關(guān)閉資源
                    socket.close();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();


    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容