socket(简称 套接字)是进程之间通信的一个工具,进程之间想要进行网络通信需要socket
2个进程之间通过socket进行相互通信,就必须有服务端和客户端
socket服务端:等待其它进程的连接、可接受发来的信息、可以回复信息
socket客户端:主动连接服务端、可以发送信息、可以接收回复
socket服务端编程:
# 导入socket模块
import socket
# 创建socket对象
socket_server = socket.socket()
# 绑定socket_server到指定IP和端口
socket_server.bind(("localhost", 8888))
# 服务端开始监听端口,backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值
backlog = 1
socket_server.listen(backlog)
# 接收客户端连接,获得连接对象
# accept方法是阻塞方法,如果没有连接,会卡在当前这一行不向下执行代码
# accept返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素
conn, address = socket_server.accept()
print(f"接收到客户端连接,连接来自:{address}")
# 客户端连接后,通过recv方法,接收客户端发送的消息
while True:
# recv方法的返回值是字节数组(Bytes),可以通过decode使用UTF-8解码为字符串
# recv方法的传参是buffsize,缓冲区大小,一般设置为1024即可
data = conn.recv(1024).decode("UTF-8")
print(f"接受到客户端发来的数据:{data}")
# 通过conn(客户端当此连接对象),调用send方法可以回复消息
send_data = input("请输入你要回复的消息:")
if send_data == 'exit':
break
conn.send(send_data.encode("UTF-8"))
# conn(客户端当此连接对象)和socket_server对象调用close方法,关闭连接
conn.close()
socket_server.close()
socket客户端编程:
# 导入socket模块
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(("localhost", 8888))
# 发送消息
while True:
send_msg = input("请输入要发送的消息:")
if send_msg == 'exit':
break
# 消息需要编码为字节数组(UTF-8编码)
socket_client.send(send_msg.encode("UTF-8"))
# 接收消息,缓冲区大小一般设为1024即可,recv方法是阻塞式的,即不接收到返回,就卡在这里等待
recv_data = socket_client.recv(1024)
# 接收的消息需要通过UTF-8解码为字符串
print(f"服务端回复消息为:{recv_data.decode('UTF-8')}")
# 关闭连接
socket_client.close()