网络通信 Python Socket UDP Select

2019-05-26  本文已影响0人  xukai871105

前言

工作中遇到各种各样的网络通信。有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议。使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始socket,Python Socket。各有各的使用场景,难易程度相差巨大。Netty上手困难,C语言编写复杂,Python Socket上手容易。
长久以来,UDP通信一直被误解为一种不可靠的通信手段,但是UDP简单使用,特别适合物联网终端。UDP没有三次握手和四次挥手,换个角度来说节约了网络流量,降低了设备的功耗。UDP协议也是物联网应用层协议CoAP、LwM2M的传输层协议,也有消息说HTTP 3.0协议将使用UDP作为传输层协议

示例简述

服务器示例

udp-server-select.py

import select
import socket
import binascii

HOST = ''
PORT = 50018

server_fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_fd.bind((HOST, PORT))
print('starting up on %s port %s' % (HOST, PORT))

# 把服务器套接字加入到输入列表中
inputs = [server_fd]
client_address = None
conn = None

while True:
    # readable, writable, exceptional = select.select(inputs, [], [], 1.0)
    readable = select.select(inputs, [], [], 1.0)[0]
    for s in readable:
        data, client_address = s.recvfrom(1024)
        if data:
            # 收到客户端数据
            print('received "%s" from %s' % (binascii.hexlify(data), client_address))
            s.sendto(data, client_address)

代码说明

客户端示例

请参考【网络通信 Python Socket UDP

运行与测试

先启动UDP服务器,再启动UDP客户端。

服务器控制台可能输出

connected by ('127.0.0.1', 50019) received  b'31323334'
connected by ('192.168.3.18', 50019) received  b'31323334'

客户端控制台可能输出

received b'31323334' from ('127.0.0.1', 50018)

相关资料

上一篇 下一篇

猜你喜欢

热点阅读