zoukankan      html  css  js  c++  java
  • python Android udp通信

    python发送:

    参考:https://www.cnblogs.com/reader/p/10011666.html

    # -*- coding:utf-8 -*-
    
    from socket import *
    from time import ctime, sleep
    import threading
    
    
    class ChatRoomPlus:
        def __init__(self):
            # 全局参数配置
            self.encoding = "utf-8"  # 使用的编码方式
            self.broadcastPort = 22222   # 广播端口
    
            # 创建广播接收器
            self.recvSocket = socket(AF_INET, SOCK_DGRAM)
            self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
            self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
            self.recvSocket.bind(('', self.broadcastPort))
    
            # 创建广播发送器
            self.sendSocket = socket(AF_INET, SOCK_DGRAM)
            self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    
            # 其他
            self.threads = []
    
        def send(self):
            """发送广播"""
    
            print("UDP发送器启动成功...")
            while True:
                sendData="hello123"
                self.sendSocket.sendto(sendData.encode(self.encoding), ('255.255.255.255', self.broadcastPort))
                print("【%s】%s:%s" % (ctime(), "", sendData))
    
                sleep(1)
            self.sendSocket.close()
    
        def recv(self):
            """接收广播"""
    
            print("UDP接收器启动成功...")
            while True:
                # 接收数据格式:(data, (ip, port))
                recvData = self.recvSocket.recvfrom(1024)
    
                print("【%s】[%s : %s] : %s" % (ctime(), recvData[1][0], recvData[1][1], recvData[0].decode(self.encoding)))
    
                sleep(1)
    
        def start(self):
            """启动线程"""
    
            # t1 = threading.Thread(target=self.recv)
            t2 = threading.Thread(target=self.send)
            # self.threads.append(t1)
            self.threads.append(t2)
    
            for t in self.threads:
                t.setDaemon(True)
                t.start()
    
            while True:
                pass
    
    
    if __name__ == "__main__":
        demo = ChatRoomPlus()
        demo.start()

    Android接收:

    参考:https://blog.csdn.net/aino0613/article/details/73087313

    需要先在AndroidManifest.xml添加权限

    <uses-permission android:name="android.permission.INTERNET" />

       private DatagramSocket msocketClient;
        private DatagramPacket Packet_Receive;
        private String ip;
        private String Port;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et1 = findViewById(R.id.EditText02); Open(); } public void Open() { System.out.println("***start***"); try { msocketClient = new DatagramSocket(null); msocketClient.setReuseAddress(true); msocketClient.bind(new InetSocketAddress(22222)); } catch (Exception e) { e.printStackTrace(); } if (msocketClient != null) { new Thread(UdpReceiver).start(); } } Runnable UdpReceiver = new Runnable() { @Override public void run() { WifiManager mwifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock lock= mwifiManager.createMulticastLock("UDPwifi"); while (true) { // System.out.println("***UdpReceiver***"); byte[] Buffer_Receive = new byte[1024]; Packet_Receive = new DatagramPacket(Buffer_Receive, 1024); if (Packet_Receive != null) { try { lock.acquire(); msocketClient.receive(Packet_Receive); int length = Packet_Receive.getLength(); if (length > 0) { final String data = new String(Buffer_Receive, 0, Packet_Receive.getLength()); // System.out.println("***data***"+data); ip=""+Packet_Receive.getAddress(); Port=""+data; // System.out.println("ip : "+Packet_Receive.getAddress()+"port :"+Packet_Receive.getPort()); runOnUiThread(new Runnable() { @Override public void run() { et1.setText("已连接"+ip+":"+Port); } }); } lock.release(); } catch (IOException e) { e.printStackTrace(); } } } } };

    Android手机和电脑(运行python程序)必须在同一网络下(比如同一wifi),否则连接不上。即使手机连接的是电脑发射的热点wifi都不可以。或者使用电脑里的Android模拟机也连接不上。

    参考:https://blog.csdn.net/ns_code/article/details/13094375

    https://blog.csdn.net/qq_26075861/article/details/78361363

  • 相关阅读:
    jQuery EasyUI API 中文文档 可调整尺寸
    jQuery EasyUI API 中文文档 链接按钮(LinkButton)
    jQuery EasyUI API 中文文档 手风琴(Accordion)
    jQuery EasyUI API 中文文档 表单(Form)
    jQuery EasyUI API 中文文档 组合(Combo)
    jQuery EasyUI API 中文文档 布局(Layout)
    jQuery EasyUI API 中文文档 拆分按钮(SplitButton)
    jQuery EasyUI API 中文文档 菜单按钮(MenuButton)
    jQuery EasyUI API 中文文档 搜索框
    jQuery EasyUI API 中文文档 验证框(ValidateBox)
  • 原文地址:https://www.cnblogs.com/cekong/p/11414512.html
Copyright © 2011-2022 走看看