Android Socket编程(udp)初探

简介: 前言昨天刚把socket tcp编程简单讲解了,今天趁热打铁把udp编程也讲一下。一个是为了提醒自己,坚持下去,另外还是为了提升技术打下基础。如果讲的有什么不对的还请各位指正。

前言

昨天刚把socket tcp编程简单讲解了,今天趁热打铁把udp编程也讲一下。一个是为了提醒自己,坚持下去,另外还是为了提升技术打下基础。如果讲的有什么不对的还请各位指正。

首先

先上图,俗话说no pic say a xx


img_d3edf97de05da1dbb007df74b7e7ef5e.png
udp编程服务端.png
img_ca789b24040d3c700af4e3664f4930ae.png
udp编程客户端.png

其次

  • 客户端代码(线程中)

    public class UdpClientThread extends Thread {
    
    //IP地址
    private String mAddress;
    //端口
    private int port;
    //发送内容
    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();
    }
    
    /**
     * 设置
     */
    private void sendSocket() {
      byte[] bytes = msg.getBytes();
      try {
          /*******************发送数据***********************/
          InetAddress address = InetAddress.getByName(mAddress);
          //1.构造数据包
          DatagramPacket packet = new DatagramPacket(bytes, 
    bytes.length, address, port);
          //2.创建数据报套接字并将其绑定到本地主机上的指定端口。
          DatagramSocket socket = new DatagramSocket();
          //3.从此套接字发送数据报包。
          socket.send(packet);
          /*******************接收数据***********************/
          //1.构造 DatagramPacket,用来接收长度为 length 的数据包。
          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();
      }
    }
    
    /**
     * 发送消息
     */
    private void sendMsg(int what, Object object) {
      Message msg = new Message();
      msg.what = what;
      msg.obj = object;
      mHandler.sendMessage(msg);
     }
     }
    

说明:这里的封装和tcp中的一样,就是换一下参数和包装类,代码中的解释都比较清楚。

  • 客户端(使用)

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

说明:这里直接点击按钮调用线程使用即可,当然,也可以直接用线程池来构造参数。

  • 服务端(代码)

    public class UdpServer {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
      while (true) {
          getMsg();
      }
    }
    
    /**
     * 获取信息
     */
    private static void getMsg() {
      try {
          byte[] buf = new byte[1024];
          // 一、接收数据
          // 1、创建接收数据的数据包
          DatagramPacket packet = new DatagramPacket(buf, buf.length);
          // 2.创建UPD 的 socket
          DatagramSocket socket = new DatagramSocket(12306);
          // 3、接收数据
          System.out.println("服务端开始监听!~~~~");
          socket.receive(packet);
          // 4、处理数据
          System.out.println("服务端:" + new String(buf, 0, buf.length));
    
          // 二、返回数据
          DatagramPacket packet2 = new DatagramPacket(buf, buf.length,
                  packet.getAddress(), packet.getPort());
          socket.send(packet2);
          socket.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
    
    }
    
    }
    

最后

唠叨一下,做事一定要善始善终,做人一定要诚信(ps:最近遇到了一个不诚信的公司,offer发了之后,第二天告诉我不用去了,问过原因之后,人事和老板助理回复还不一样,这样就有点好玩了,真的是越想越生气。尤其是对于我这种对诚信比较看重的人,真的是不能忍。特别痛恨那种答应别人却做不到的人,要不就别答应,要不就做到。我一般答应别人的事情,一定会做到,不管我要付出什么,起码我兑现了自己的承诺。)。发了一顿牢骚,还请各位看官见谅。

致谢

Android网络编程之--Socket编程

相关文章
|
15天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
2月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
147 1
|
2月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
26 0
|
3月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
5月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
60 4
|
5月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
37 3
|
5月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
67 2
|
5月前
|
网络协议 程序员 视频直播
|
5月前
|
消息中间件 网络协议 网络安全
Python Socket编程:打造你的专属网络通道,基础篇与进阶篇一网打尽!
【7月更文挑战第26天】在网络编程领域,Python以简洁语法和强大库支持成为构建应用的首选。Socket编程为核心,实现计算机间的数据交换。
72 1
|
5月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解