Android Socket編程(udp)初探

前言

昨天剛把socket tcp編程簡單講解了,今天趁熱打鐵把udp編程也講一下。一個(gè)是為了提醒自己,堅(jiān)持下去,另外還是為了提升技術(shù)打下基礎(chǔ)。如果講的有什么不對的還請各位指正。

首先

先上圖,俗話說no pic say a xx


udp編程服務(wù)端.png
udp編程客戶端.png

其次

  • 客戶端代碼(線程中)

    public class UdpClientThread extends Thread {
    
    //IP地址
    private String mAddress;
    //端口
    private int port;
    //發(fā)送內(nèi)容
    private String msg;
    private Handler mHandler;
    
    public UdpClientThread(Handler handler, String address, int port, String msg) {
      this.mHandler = handler;
      this.mAddress = address;
      this.port = port;
      this.msg = msg;
    }
    
    @Override
    public void run() {
      super.run();
      sendSocket();
    }
    
    /**
     * 設(shè)置
     */
    private void sendSocket() {
      byte[] bytes = msg.getBytes();
      try {
          /*******************發(fā)送數(shù)據(jù)***********************/
          InetAddress address = InetAddress.getByName(mAddress);
          //1.構(gòu)造數(shù)據(jù)包
          DatagramPacket packet = new DatagramPacket(bytes, 
    bytes.length, address, port);
          //2.創(chuàng)建數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的指定端口。
          DatagramSocket socket = new DatagramSocket();
          //3.從此套接字發(fā)送數(shù)據(jù)報(bào)包。
          socket.send(packet);
          /*******************接收數(shù)據(jù)***********************/
          //1.構(gòu)造 DatagramPacket,用來接收長度為 length 的數(shù)據(jù)包。
          final byte[] bytes1 = new byte[1024];
          DatagramPacket receiverPacket = new DatagramPacket(bytes1, bytes1.length);
          socket.receive(receiverPacket);
          sendMsg(0,new String(bytes1, 0, bytes1.length));
          socket.close();
      } catch (UnknownHostException e) {
          e.printStackTrace();
      } catch (SocketException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
    }
    
    /**
     * 發(fā)送消息
     */
    private void sendMsg(int what, Object object) {
      Message msg = new Message();
      msg.what = what;
      msg.obj = object;
      mHandler.sendMessage(msg);
     }
     }
    

說明:這里的封裝和tcp中的一樣,就是換一下參數(shù)和包裝類,代碼中的解釋都比較清楚。

  • 客戶端(使用)

    public class UdpClientActivity extends AppCompatActivity
      implements View.OnClickListener {
    
    Button mBtnSend;
    String mAddress = "192.168.0.197";
    int port = 12306;
    TextView mTxtContent;
    EditText mEdtContent;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_udp_client);
      initView();
    }
    
    private void initView() {
      mEdtContent = findViewById(R.id.edt_udp_content);
      mBtnSend = findViewById(R.id.btn_udp_send);
      mTxtContent = findViewById(R.id.txt_udp_content);
      mBtnSend.setOnClickListener(this);
    }
    
    
    @Override
    public void onClick(View view) {
      switch (view.getId()) {
          case R.id.btn_udp_send: {
              UdpClientThread mThread = new UdpClientThread(mHandler, mAddress, port,
                      mEdtContent.getText().toString());
              mThread.start();
              break;
          }
      }
    }
    
    /**
     * Handler
     */
    private Handler mHandler = new Handler(Looper.myLooper()) {
      @Override
      public void handleMessage(Message msg) {
          super.handleMessage(msg);
          switch (msg.what) {
              case 0: {
                  String content = (String) msg.obj;
                  mTxtContent.setText(content);
                  break;
              }
          }
      }
    };
    }
    

說明:這里直接點(diǎn)擊按鈕調(diào)用線程使用即可,當(dāng)然,也可以直接用線程池來構(gòu)造參數(shù)。

  • 服務(wù)端(代碼)

    public class UdpServer {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
      while (true) {
          getMsg();
      }
    }
    
    /**
     * 獲取信息
     */
    private static void getMsg() {
      try {
          byte[] buf = new byte[1024];
          // 一、接收數(shù)據(jù)
          // 1、創(chuàng)建接收數(shù)據(jù)的數(shù)據(jù)包
          DatagramPacket packet = new DatagramPacket(buf, buf.length);
          // 2.創(chuàng)建UPD 的 socket
          DatagramSocket socket = new DatagramSocket(12306);
          // 3、接收數(shù)據(jù)
          System.out.println("服務(wù)端開始監(jiān)聽!~~~~");
          socket.receive(packet);
          // 4、處理數(shù)據(jù)
          System.out.println("服務(wù)端:" + new String(buf, 0, buf.length));
    
          // 二、返回?cái)?shù)據(jù)
          DatagramPacket packet2 = new DatagramPacket(buf, buf.length,
                  packet.getAddress(), packet.getPort());
          socket.send(packet2);
          socket.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
    
    }
    
    }
    

最后

嘮叨一下,做事一定要善始善終,做人一定要誠信(ps:最近遇到了一個(gè)不誠信的公司,offer發(fā)了之后,第二天告訴我不用去了,問過原因之后,人事和老板助理回復(fù)還不一樣,這樣就有點(diǎn)好玩了,真的是越想越生氣。尤其是對于我這種對誠信比較看重的人,真的是不能忍。特別痛恨那種答應(yīng)別人卻做不到的人,要不就別答應(yīng),要不就做到。我一般答應(yīng)別人的事情,一定會做到,不管我要付出什么,起碼我兌現(xiàn)了自己的承諾。)。發(fā)了一頓牢騷,還請各位看官見諒。

致謝

Android網(wǎng)絡(luò)編程之--Socket編程

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

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