一:socket介绍:进程之间通信的一种方式:
创建流程:
1:创建套接字
2:使用socket套接字收发数据:
3:关闭套接字
二:使用UDP循环发送数据
案例:利用Ubuntu发送数据给Windows
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 使用套接字收发数据,必须是字节类型
udp_socket.sendto(b"hahahhaha",('192.168.42.123', 8080))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
注意:
1:socket.AF_INET,表示是IPv4,socket.SOCK_DGRAM,表示UDP进行通信。
2:注意在模拟的时候,必须Ubuntu设置成桥接模式,然后查看Ubuntu的IP地址,网络调试助手选择和Ubuntu同一网段的网络(前三个IP地址相同)。
案例:循环发送数据
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
#从键盘中发送数据
send_data = input("请输入您要发送的数据:")
if send_data == "exit":
break
# 使用套接字收发数据,必须是字节类型
udp_socket.sendto(send_data.encode("utf-8"),('192.168.42.123', 8080))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
三:使用UDP接收数据:
流程:
1:创建套接字:
2:绑定本地信息
3:等待对方发送数据
4:显示接收到的数据
5:关闭套接字
我的Ubuntu的IP地址是:192.168.42.73
案例:
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定本地信息
localaddr = ("192.168.42.73", 7788)
udp_socket.bind(localaddr)
#等待对方发送数据
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0]
send_addr = recv_data[1]
# 显示接收到的数据
print("%s:%s" % (str(send_addr),recv_msg.decode("gbk")))
#关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
注意:
1:recvfrom(1024) :1024表示接收数据最大值。
2:因为发送数据是前面数据,后面是绑定的信息,所以要分别取出。
3:为什么要用“gbk”解密?
因为发送方是以gbk的方式加密的,所有接收方Ubuntu要用gbk方式解密。
四:上面循环发送存在的问题:
因为上面发送信息的时候没有绑定端口,所以在运行01-socket.py的时候,第一次运行的结果会在一行显示,第二次运行,又在另外一行显示。因为发送时没有绑定端口,所以系统自动分配端口(1024~65535)。我们只需要在循环前绑定端口就可以了。
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地端口
udp_socket.bind("192.168.42.73", 7788)
while True:
#从键盘中发送数据
send_data = input("请输入您要发送的数据:")
if send_data == "exit":
break
# 使用套接字收发数据,必须是字节类型
udp_socket.sendto(send_data.encode("utf-8"),('192.168.42.123', 8080))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()