首页 > 编程语言 > 详细

python网络编程udp篇

时间:2021-09-17 14:33:33      阅读:16      评论:0      收藏:0      [点我收藏+]

二元组
(ip,port)
通信端----socket

client ---请求--> server
<-----再回复

server 监听 bind()
client 是os随机分配port

注意python的缩进
不加; 直接

ipv4 /6 -----> socket.AF_INET,/6
SOCK_DGRAM--->数据包服务 udp
stream--->流式tcp

{}要用format()的填充
grtsockname ---二元组

recvfrom ----返回值 没有检查安全的相应机制

接受数据
二进制流解码成字符串
texe=data.decode(‘ascii‘)

ascii---西文 utf8 / gb2312
发送之前要编码成二进制流
data= text.encode(‘ascii‘)
sendto(data,address)-----生成一个udp报文

recvfrom接口安全性
代码可能接受任何人发送过来的数据
防御:加一个随机数---增加安全性
用connet--只跟对方的端点通信(只允许服务器发送数据包)

阻塞
不可靠性
超时
退避

python3代码:

import argparse,socket
from datetime import datetime

CODING="utf8"

MAX_BYTES = 65535

def server(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((‘127.0.0.1‘,port))
print("Listening at {}".format(sock.getsockname()))
while True:
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode(CODING)
print(‘The client at {} says {}‘.format(address,text))
text = ‘Your dara was {} bytes long‘.format(len(data))
sock.sendto(text.encode(CODING),address)

def client(port):
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
text = ‘The time is {}‘.format(datetime.now())
sock.sendto(text.encode(CODING),(‘127.0.0.1‘,port))
print(‘The os assigned me the address {}‘.format(sock.getsockname()))
data, address = sock.recvfrom(MAX_BYTES) # Danger! See Chap
print(‘The server {} replied {}‘.format(address,data.decode(CODING)))

if name== ‘main‘:
choices = {‘client‘: client, ‘server‘:server}
parser = argparse.ArgumentParser(description=‘Send and receive UDP locally‘)
parser.add_argument(‘role‘,choices=choices,help=‘which orle to play:chient or server.‘)
parser.add_argument(‘-p‘,metavar=‘PORT‘,type=int,default=1060,help=‘UDP port(defuault 1060)‘)
args = parser.parse_args()
function = choices[args.role]
function(args.p)

python网络编程udp篇

原文:https://www.cnblogs.com/mypf/p/15302473.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!