各种协议服务器端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()
运行结果: