1.创建套接字
import socket
'''创建套接字
family=AF_INET
协议族 AF_INET ipv4 AF_INET6 ipv6
type=SOCK_STREAM
套接字类型 TCP SOCK_STREAM 流式套接字 UDP SOCK_DGRAM 数据报套接字
'''
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
2.UDP发送数据
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
send_data = input('请输入要发送的数据:')
if send_data == 'exit':
break
'''windows默认编码是gbk'''
send_data = send_data.encode('gbk')
udp_socket.sendto(send_data, ('127.0.0.1', 8080))
udp_socket.close()
if __name__ == '__main__':
main()
数据发送成功,但是上图中,发送方的端口是系统随机分配的,如果重新运行程序,该端口就会改变,所以绑定端口
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''没有绑定的话 端口就是随机分配的'''
udp_socket.bind(("", 7890))
while True:
send_data = input('请输入要发送的数据:')
if send_data == 'exit':
break
'''windows默认编码是gbk'''
send_data = send_data.encode('gbk')
udp_socket.sendto(send_data, ('127.0.0.1', 8080))
udp_socket.close()
if __name__ == '__main__':
main()
3.UDP接收数据
'''
1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
'''
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''不写ip 表示本机的任何一个ip'''
bind_addr = ('', 7789)
'''绑定IP'''
udp_socket.bind(bind_addr)
while True:
'''1024 表示本次接收的最大字节数'''
recv_data = udp_socket.recvfrom(1024)
print(recv_data)
udp_socket.close()
if __name__ == '__main__':
main()
在网络调试助手中发送数据
接收到的数据格式是一个元组(接收的数据, (发送方IP, 发送方端口))
可以看到,发送的中文“加油”变成了’\xbc\xd3\xd3\xcd’,接收到的数据的格式很不美观,并且只能接收一条信息,所以下面要增加循环,进行解码,更改输出格式
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''不写ip 表示本机的任何一个ip'''
bind_addr = ('', 7789)
'''绑定IP'''
udp_socket.bind(bind_addr)
while True:
'''1024 表示本次接收的最大字节数'''
recv_data = udp_socket.recvfrom(1024)
recv = recv_data[0]
ip_port = recv_data[1]
print("发送方IP和端口:" + str(ip_port))
print("收到的消息::" + recv.decode('gbk'))
udp_socket.close()
if __name__ == '__main__':
main()
4.简单的UDP聊天器
import socket
def send_data(udp_socket):
'''发送数据'''
send_data = input('请输入要发送的数据:')
dest_ip = input('请输入要发送的IP:')
dest_port = int(input('请输入要发送的端口:'))
udp_socket.sendto(send_data.encode('gbk'), (dest_ip, dest_port))
def recv_data(udp_socket):
'''接收数据'''
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (recv_data[1], recv_data[0].decode('gbk')))
def main():
'''创建套接字 同时接收发送数据'''
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''绑定'''
udp_socket.bind(("", 7890))
while True:
'''发送'''
send_data(udp_socket)
'''接收'''
recv_data(udp_socket)
if __name__ == '__main__':
main()