Python网络编程与并发(3)

本文介绍了如何使用Python进行UDP服务器和客户端的编程。首先展示了UDP服务器端的实现,包括创建套接字、绑定地址和端口、接收和回显数据。接着,给出了UDP客户端的代码,用于发送数据到服务器并接收回显。最后,演示了UDP的echo服务,服务器接收到数据后原样返回,支持多个客户端同时交互。
摘要由CSDN通过智能技术生成

各种协议服务器端Socket编程

1.UDP服务器端

UDP数据包括目的端口号和源端口号信息,由于通信不建立连接,所以可以实现广播发送。UDP传输的数据包必须被限制在64KB以内。服务器端流程:

①使用函数socket()生成套接字;

②通过host_post结构设置服务器地址和监听端口;

③使用bind()函数绑定监听端口,将套接字文件描述符和地址类型变量(host_post)进行绑定;

④接收客户端的数据,使用recvfrom()函数接收客户端的网络数据;

⑤关闭套接字,使用close()函数释放资源。

服务器端代码:

from socket import *
#1.创建UDP服务端Socket
socket_server = socket(AF_INET,SOCK_DGRAM)
#2.定义服务器端的IP地址和端口号
#10.175.255.254为本机IP地址,端口号8090由程序员规定
host_port = ('10.175.193.126',8090)
#3.服务器端socket绑定地址和端口
socket_server.bind(host_port)
#4.接受客户端的数据,每次接收1KB的数据
datas = socket_server.recvfrom(1024)
print(datas[0].decode('utf-8')) #解码输出
print(datas) #未解码的输出
#5.关闭套接字,释放资源
socket_server.close()

客户端代码:

from socket import *
#1.创建一个UDP协议的套接字,然后发送一条数据到网络上的另一个进程
#创建套接字('10.175.255.254',8090)
client_socket = socket(AF_INET,SOCK_DGRAM)
#2.定义一个接受消息的目标
#8090是目标服务器的端口,10.175.255.254是目标服务器地址
server_host_port = ('10.175.193.126',8090)
#3.准备数据,encode将数据变为字节数组
datas = input("请输入要传输的数据:").encode('utf-8')
#4.发送数据
client_socket.sendto(datas,server_host_port)
print('发送完成')
#5.发送结束后关闭套接字,释放系统资源
client_socket.close()

先启动服务器端的代码,再启动客户端的代码,在客户端输入数据("我爱你")之后,服务端收到如下数据包:

收到的数据包是一个元组,元组第一项是数据,第二项是原地址和原端口。

2. UDP的echo客户端代码

echo服务是一种非常有用的调试和检测的工具,该协议将接收的原样发回,即存在回显。

注意:客户端可以发送多条数据;客户端如果发送exit,则表示客户端退出;服务器端收到什么就返回什么。

下面实现UDP多个客户端与一个服务端发送多条数据:

服务端代码:

from socket import *
socket_server = socket(AF_INET,SOCK_DGRAM)
host_port = ('',8090) #使用空字符串绑定本机所有IP地址
socket_server.bind(host_port)
while True:
    datas = socket_server.recvfrom(1024) #接收数据
    #将收到的数据返回,且返回给相应客户端
    socket_server.sendto(datas[0],datas[1])
    print(datas[0].decode('utf-8'))
    print(datas)
socket_server.close()

客户端代码,多个客户端代码都一样:

from socket import *
#定义变量,作为是否退出客户端的标志
flag = True
client_socket = socket(AF_INET,SOCK_DGRAM) #创建套接字
while flag:
    server_host_port = ('10.175.193.126',8090)
    datas = input('请输入:').encode('utf-8') #encode将字符串变为字节数据
    client_socket.sendto(datas,server_host_port)
    #若接收到从服务器返回过来的数据,将其打印
    print("返回的数据是:",client_socket.recvfrom(1024)[0].decode('utf-8'))
    if(datas.decode('utf-8')=='exit'):
        flag = False
client_socket.close()

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长得丑就要多读书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值