抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

发送数据的流程

  1. 创建套接字
  2. 发送数据
  3. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import socket

def main():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地信息
local_addr = ("", 7890)
udp_socket.bind(local_addr)
# 目的地主机信息
desc_addr = ("10.197.36.81", 8080)
# 发送数据
while True:
sent_content = input("请输入要发送的消息:")
if(sent_content == "exit"):
break
udp_socket.sendto(sent_content.encode("gbk"), desc_addr)

# 关闭套接字
udp_socket.close()

if __name__ == "__main__":
main()

接收数据的流程

  1. 创建套接字
  2. 绑定本地自己的信息(ip及port)
  3. 接收数据
  4. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import socket
import datetime

def main():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地地址信息
local_addr = ("", 8088)
udp_socket.bind(local_addr)
times = datetime.datetime.now().strftime('%F %T')
while True:
# 接收数据
recv = udp_socket.recvfrom(1024)
recv_data = recv[0].decode("gbk")
recv_addr = recv[1][0];
# 打印接收到的数据
print("【%s】 接收到来自%s的消息:\n%s" % (times, recv_addr, recv_data))
# 关闭udp套接字
udp_socket.close()

if __name__ == "__main__":
main()

同一个端口不允许同一时刻被使用两次

Question

  1. recvfrom 在没有数据到来时,会怎样?

会阻塞。


套接字是可以同时收发数据的。

socket套接字是全双工。


单工:单工数据传输只支持数据在一个方向上传输。

半双工: 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。

全双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

案例:UDP聊天器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import socket


def send_msg(udp_socket):
desc_ip = input("请输入对方的IP地址:")
desc_port = int(input("请输入对方的端口号:"))
desc_addr = (desc_ip, desc_port)
send_content = input("请输入需要发送的消息:")
udp_socket.sendto(send_content.encode("gbk"), desc_addr)


def recv_msg(udp_socket):
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode("gbk")
recv_addr = recv_data[1][0]
print("您收到了来自【%s】的消息:\n%s" % (recv_addr, recv_msg))


def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

local_addr = ("", 8888)
udp_socket.bind(local_addr)
# 发送和接收
while True:
print("------------- UDP聊天器 -------------")
print("1. 发送数据")
print("2. 接收数据")
print("0. 退出系统")
choice = input("请输入功能选项:")
if choice == "1":
# 发送数据
send_msg(udp_socket)
elif choice == "2":
# 接收数据
recv_msg(udp_socket)
elif choice == "0":
break
else:
print("输入有误,请重新输入!\n")


if __name__ == "__main__":
main()

评论