本小节内容:实现简单的信息交流
一、 Socket介绍
socket (简称 套接字) 模块是其内置的标准库之一,它实现了BSD sockets API,允许开发者在Python程序中进行网络通信。Python的socket模块为开发者提供了丰富的API,使得编写网络客户端和服务器变得相对简单,无论是构建简单的聊天应用、Web服务器还是其他网络应用程序都离不开它的支持
二、客户端与服务端
Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息
Socket客户端:主动连接服务端、可以发送消息、可以接收回复
三、在python中实现网络通信
首先在pycharm中新建两个模块,分别是客户端socket和服务端socket
1. 服务端
语法:
1.创建socket对象
import socket
socket_server=socket.socket()
2.绑定socket_server到指定IP和地址,这里是以二元元组的形式填写
socket_server.bind(host,port)
3. 服务端开始监听端口 backlog为int类型,表示允许接受数量,可填可不填
socket_server.listen(backlog)
4. 接受客户端连接,获得连接对象 注意:应先链接成功后才能输出,如未链接成功则卡在此步
conn,address=socket_server.accept()
print(f"接收到客户端连接,连接来自:{address}")
5.客户端连接后,通过recv方法,接收客户端发送的消息
while True:
# 两种编码类型相互转换 recv方法的传参是buffsize,缓冲区大小一般设置为1024
data = conn.recv(1024).decode("Utf-8")
if data == 'exit':
break
print("接收到发送来的数据:",data)
6. 关闭连接
conn.close()
socket_server.close()
案例:
import socket
socket_server=socket.socket()
socket_server.bind(("localhost",8888))
socket_server.listen(1)
# accpet方法返回的是二元元组(链接对象,客户端地址信息)
conn,address=socket_server.accept()
print(f"接收到了客户端的链接,客户端的信息是:{address}")
# 利用循环无限的与客户端的交流
while True:
data: str = conn.recv(1024).decode("UTF-8")
print(f"客户端发来的消息是:{data}")
msg = input("请输入你要和客户端回复的信息:")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8"))
# 关闭链接
conn.close()
socket_server.close()
2. 客户端
语法:
1.创建socket对象
import socket
socket_server=socket.socket()
2. 连接到服务端 这里使用的是connect方法
socket_client.connect(host,port)
3.发送信息
while True:
msg=input("请输入要给服务发送的消息:")
if msg == 'exit':
break
# 接收的信息相互转换(字节和UTF-8格式转换)
socket_client.send(msg.encode("UTF-8"))
4.接收服务端信息
recv_data=socket_client.recv(1024)
print(f"服务端回复的信息是:{recv_data.decode('UTF-8')}")
5. 关闭链接
socket_client.close()
案例:
import socket
# 创建对象
socket_client=socket.socket()
# 链接服务端使用connect
socket_client.connect(("localhost",8888))
# 使用循环
while True:
msg=input("请输入要给服务发送的消息:")
if msg == 'exit':
break
# 接收的信息相互转换(字节和UTF-8格式转换)
socket_client.send(msg.encode("UTF-8"))
recv_data=socket_client.recv(1024)
print(f"服务端回复的信息是:{recv_data.decode('UTF-8')}")
# 关闭链接
socket_client.close()