前言
最近研究了一下python的socket的使用,特此记录下来,方便以后参考。
一、什么是套接字?
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。它们使在两个不同程序或设备之间的信息传输成为可能。
二、python中套接字的常用方法
方法名 | 描述 |
---|---|
socket.socket() | 用于创建套接字(服务器和客户端都需要创建套接字) |
socket.accept() | 用于接受连接。它返回一对值(conn,address),其中conn是用于发送或接收数据的新套接字对象,而address是连接另一端存在的套接字的地址 |
socket.bind() | 用于绑定到指定为参数的地址(用于服务器端) |
socket.close() | 用于将套接字标记为已关闭 |
socket.connect() | 用于连接到指定为参数的远程地址 |
socket.listen() | 使服务器能够接受连接(用于服务器端) |
三、使用
目标:创建一个简单的套接字应用,客户端发送一条数据个服务器端,服务器端收到信息后,返回一条数据给客户端。
1、服务器端代码
socket_server.py
"""
展示Socket服务器开发
"""
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口,参数表示接受的链接数量
socket_server.listen(2)
# 等待客户端信息,accept()是阻塞方法,等待客户端链接;没有链接会一直等待
conn, address = socket_server.accept()
print(f"接收到了客户端的链接,客户端的信息是:{address}")
while True:
# 接受客户端信息,要使用客户端和服务端本次的链接对象
# recv接受的参数是缓冲区大小,一般为1024
# recv方法返回的是一个字节数组也就是byte对象,不是字符串,可以通过decode方法使用UTF-8编码,将字节数组转换为字符串对象
data = conn.recv(1024).decode("UTF-8")
print(f"客户端发来的消息是:{data}")
# 发送回复消息
msg = input("请输入你要和客户端回复的消息:").encode("UTF-8") # encode可以将字符串编码为字节数组
conn.send(msg)
# 关闭链接
conn.close()
socket_server.close()
2、客户端代码
socket_client.py
"""
演示Socket客户端开发
"""
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接服务器
socket_client.connect(("localhost", 8888))
while True:
# 发送消息
msg = input("请输入你要发送的消息:")
if msg == "exit":
break
socket_client.send(msg.encode("UTF-8"))
# 接收返回消息
recv_data = socket_client.recv(1024).decode("UTF-8")
print(f"服务端回复的消息是:{recv_data}")
# 关闭链接
socket_client.close()
然后分别运行这两个代码(先运行服务器端)检验一下:
客户端:
服务器端:
可以看到,确实能够通信。
下一章:python套接字(二):实现一个服务器和多客户端连接