1、socketserver
socket只能够实现一对一的交互,socketserver能够实现多对多的交互,下面是使用socketserver的流程:
- 创建一个请求处理类,这个类继承BaseRequestHandler,并且重写父类的handle()方法
- 实例化一个server class(在这里我们使用TCPServer),并且传递server ip和上面创建的请求处理类给实例
- 调用server.handle.request()(处理个一个请求,不常用)/server.server.forever()(处理多个请求永远执行,常用)
- server.close()
接下来是socketserver端的代码:
# Author: Mr.Xue
# 2019.11.2
# socketserver.py
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler): # 创建一个请求处理类
def handle(self): # 重写父类的handle()方法
while True:
#try:
self.data = self.request.recv(1024).strip() # 接收客户端传来的数据
if not self.data: # 判断客户端是否断连
print("lost a link...")
break
print("{} wrote:".format(self.client_address[0]))
print(self.data) # 打印接收的数据
self.request.send(self.data.upper()) # 将接收到的数据转换成大写发回给客户端
#except ConnectionResetError as e:
# print("err", e)
# break
if __name__ == '__main__':
HOST, PORT = 'localhost', 6961 # 本地地址,端口号
# create the server, binding to localhost on port 6961
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever() # 处理多个请求,永远执行
server.close()
2、客户端
客户端向服务器请求连接,连接上之后,再进行交互
客户端的流程如下:
1. 生成socket连接对象
2. 开始连接
3. 发送数据
4. 接收数据
5. 关闭sokect
具体实现的代码如下所示:
# Author: Mr.Xue
# 2019.10.29
# socket_client.py
import socket
client = socket.socket() # 声明socket类型,同时生成socket连接对象
client.connect(('localhost', 6961)) # 开始连接,ip地址为本地,端口号为6961
while True:
msg = input(">>") # 输入要发送的信息
print(len(msg))
if len(msg) == 0: continue # 判断输入的信息是否为空,如果空,重新输入
client.send(msg.encode("utf-8")) # 发送信息到服务器
data = client.recv(1024) # 接收服务器发过来的信息
print('client_recv:', data.decode()) # 打印服务器发来的信息
client.close() # 最后,关闭客户端
3、测试
在这里,我们启动两个客户端和一个服务器来做测试
先启动服务器
xue@xue-MacBookAir:~/python_learn$ python3 socketserver.py
启动两个客户端
client1
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py
>>
client2
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py
>>
client1发送1,client2发送2
client1
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py
>>1
1
client_recv: 1
>>
client2
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py
>>1
2
client_recv: 2
>>
socketserver
xue@xue-MacBookAir:~/python_learn$ python3 socketserver.py
127.0.0.1 wrote:
b'1'
127.0.0.1 wrote:
b'2'
这样就实现了多个用户同时和服务器进行交互的功能了