Socket是两个程序之间的双向通信链路。它是一种网络通信协议,用于不同计算机之间的进程间通信或同一计算机内部进程之间的通信。
import socket
s = socket.socket(AddressFamily, Type) # 创建socket套接字对象
# Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
# Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
s.close() # 关闭套接字
UDP
1、单播收发数据测试
import socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp套接字
local_addr = ('127.0.0.1',8887) # 这里ip不写默认为本机ip,需要先绑定再发送
udp_socket.bind(local_addr) # 设置发送源ip + 端口
dest_addr = ('127.0.0.1',8888) # 设置目标ip + 端口
data = input("输入发送数据:")
send_data = udp_socket.sendto(data.encode('utf-8'), dest_addr) # 发送数据
receive_data = udp_socket.recvfrom(1024) # 一直等待(堵塞),直到接收到数据为止
print("从{}的{}端口接收到信息:{}".format(receive_data[1][0],receive_data[1][1],receive_data[0].decode('utf-8')))
udp_socket.close()
2、广播发送
import socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp套接字
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST, 1) # 设置允许该udp套接字进行广播
dest_info = ('<broadcast>',9001) # 设置广播地址与端口
data = input("请输入要发送数据")
udp_socket.sendto(data.encode('utf-8'),dest_info) # 发送数据
udp_socket.close()
TCP
1、收发数据测试
# -*- coding: utf-8 -*-
import socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp套接字
tcp_socket.connect(("127.0.0.1", 9002)) # 连接目标服务器+端口
send_data = input("输入发送数据:")
tcp_socket.send(send_data.encode("utf-8")) # 发送数据
receive_data = tcp_socket.recv(1024) # 接收数据
print("收到返回信息: ", receive_data.decode('utf-8'))
tcp_socket.close() # 关闭套接字
发送数据:
接收数据:
2、TCP 服务端
# -*- coding: utf-8 -*-
import socket
tcpServer_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建等待客户端连接的tcp套接字
tcpServer_socket.bind(("", 8899)) # 绑定本地端口
tcpServer_socket.listen(128) # 更改为监听模式
connectionNewSocket, connectionInfo = tcpServer_socket.accept() # 等待客户端连接
print(connectionNewSocket) # 返回一个新的专门用于与客户端通信的套接字
print(connectionInfo) # 返回客户端ip与端口
while 1:
receive_data = connectionNewSocket.recv(1024) # 接收客户端发来的信息
"""
如果客户端关闭,则会发过来空信息,此时进行判断
有信息则不关闭tcp连接需要循环接收信息
无信息则表示客户端主动关闭连接,此时服务端再关闭连接
"""
if len(receive_data) != 0:
print("从{}的{}端口发来信息:{}".format(connectionInfo[0], connectionInfo[1], receive_data.decode("utf-8")))
else:
print("客户端已关闭")
connectionNewSocket.close()
break
tcpServer_socket.close()
此时客户端关闭连接: