socket提供了标准的BSD Socket API
以下为socket定义的常见常量:
socket 类型 | 描述 |
---|---|
socket.AF_INET | 用于服务器与服务器之间的网络通信 |
socket.SOCK_STREAM | 基于TCP的流式socket通信 |
socket.SOCK_DGRAM | 基于UDP的数据报式socket通信 |
常用函数:
Socket 函数 | 描述 |
---|---|
s.bind(address) | 将套接字绑定到地址,如果是在AF_INET下,则以无组的方式传入,如s.bind('192.168.1.1', 8080) |
s.recvfrom(bufsize[, flag]) | 接受UDP套接字的数据,返回值是元组tuple(data, addr)。其中data是包含接受数据的字符串,address是发送数据的套接字地址 |
s.sendto(string[, flag], address) | 发送UDP数据,将数据发送到套接字,address形式为tuple(ipaddr, port),指定远程地址发送,返回值是发送的字节数 |
s.close() | 关闭套接字 |
常用步骤如下:
发送方:
import socket
def send_msg():
# 1. 创建udp socket
udp_socket_send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
# 1.1 输入要发送的数据
send_data = input('请输入要发送的数据:')
if send_data == 'exit':
break
# 2. 发送data
udp_socket_send.sendto(send_data.encode('utf-8'), ('192.168.31.187', 6666))
# 3. 关闭udp_socket
udp_socket_send.close()
def main():
send_msg()
if __name__ == '__main__':
main()
接收方:
import socket
def recv_msg():
# 1. 创建套接字
udp_socket_recv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. bind ip和port
ip_port = ('', 6666)
udp_socket_recv.bind(ip_port)
while True:
# 3. 接收msg,recvfrom()返回的是一个元组,[0]是msg, [1]是一个元组的地址(ip, port)
# 并且接收到的msg=tuple[0]是一个bytes类型,打印出来时是要decode的.
msg, addr = udp_socket_recv.recvfrom(1024)
# 4. 打印接收的msg
print(f'收到来自{str(addr)}的信息:{msg.decode("utf-8")}')
# 5. 关闭套接字
udp_socket.close()
def main():
recv_msg()
if __name__ == '__main__':
main()
上面的两个实例可以同时run, 一个可以循环接收信息,一个可以循环发送信息 .