python网络编程udp篇

二元组
(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篇

上一篇:数组的使用(重点)


下一篇:c++ 学籍管理系统v 1.0