-
什么是 socket
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的。例如我们每天浏览网页、QQ 聊天、收发 email 等等 -
创建 socket
有两种socket模式,一种是udp,一种是tcp,tcp将在下一篇博客介绍。这一篇主要介绍UDP。 -
udp创建流程
创建客户端套接字
发送/接收数据
关闭套接字 -
程序实现
发送消息
import socket
def main():
# 创建UDP套接字
# 在这里 socket.AF_INET是用于Internet之间通信协议(还有socket.AF_UNIX,用于同一台机器进程间通信)
# SOCK_STREAM是流式套接字,主要用于 TCP 协议,将会在下一篇讲到,SOCK_DGRAM是用于数据报套接字,主要用于 UDP 协议
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 循环发送
while True:
# 发送的内容
send_data = input("请输入要发送的数据:")
# 退出控制
if send_data == "exit":
break
# 使用套接字发送数据
# IP和端口打包成元组
# 需要发送的内容改写成bytes类型
udp_socket.sendto(send_data.encode("utf-8"),("192.168.11.22",8888))
# 关闭套接字
udp_socket.close()
print("发送结束")
if __name__ == "__main__":
main()
接受信息
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定本地地址和端口(必须,如果不绑定那么下次发送过来数据可能因为端口改变而无法接受到)
localaddr = ("",8888) # 前面为IP地址可以省略,会自动绑定,端口一定要指定
udp_socket.bind(localaddr) # 必须要绑定自己电脑的IP和端口(port),协议要求
# 接受数据
# 循环接受
while True:
recv_data = udp_socket.recvfrom(1024)
# 这里收到的数据是一个元组 格式为(数据,(ip,port)),其中ip和port是发送端的ip和port
recv_msg = recv_data[0]
send_addr = recv_data[1]
# 打印接收到的数据
# 这里需要主要,如果是win系统则需要gbk解码,linux为utf-8,这是不同操作系统编码方式不同
print("{}:{}".format(str(send_addr),recv_msg.decode("utf-8")))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
两个结合输出结果
发送端
tom@ubuntu:~/Desktop/socket$ python3 upd_demo1.py
请输入要发送的数据:df
请输入要发送的数据:vber
请输入要发送的数据:23333
请输入要发送的数据:dajiahaop
请输入要发送的数据:你是真的皮皮虾
接收端
tom@ubuntu:~/Desktop/socket$ python3 udp_recv.py
('192.168.137.137', 46680):df
('192.168.137.137', 46680):vber
('192.168.137.137', 46680):23333
('192.168.137.137', 46680):dajiahaop
('192.168.137.137', 46680):你是真的皮皮虾
读者在用我的程序做demo时要注意两个地方,第一,IP地址要和你的符合,第二,有时你的端口(port)会被占用。