一、前言
上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户端呢?
二、发送中文信息
在python3中,socket只能发送bytes类型的数据,bytes类型只能表示0-225的ASCII码的值,并不能表示中文,所以当我们需要发送中文时,需要使用到编码和解码。
客户端:
import socket# 客户端# 声明协议类型,同时生成socket对象client = socket.socket()#client.connect(('localhost', 8888))# python3 接收字节流数据msg = input('>>:').strip()client.send(msg.encode('utf-8')) # 先编码成utf-8格式data = client.recv(1024) # 1024字节的数据print(data)print(data.decode())
服务端:
import socket# 声明协议类型server = socket.socket()# 绑定本地网卡(多网卡选择),端口server.bind(('localhost', 8888))# 监听端口server.listen() # 监听# conn 就是客户端连接后,在服务器端为其生成的一个连接实例# address 是客户端的 hostaddr,portconn, address = server.accept()print("进入等待时间....")# 等待# print(conn, address)print("收到连接....")# 接收数据data_server = conn.recv(1024)print('receive:', data_server.decode()) # 解码# 返回一个值conn.send(data_server)
三、Socket实现多个连接
这个事例需要在Linux环境下测试,在windows中测试时,多个客户端同时连接(也就是同时运行多个socket_client.py程序),其中一个断开,服务端会报错。Linux环境python版本为3.5。
事例代码:
客户端:
import socket# 客户端# 声明协议类型,同时生成socket对象client = socket.socket()#client.connect(('localhost', 8888))# python3 接收字节流数据while True: msg = input('>>:').strip() if len(msg) == 0: # 输入不能为空 continue client.send(msg.encode('utf-8')) data = client.recv(1024) # 1024字节的数据 print(data) print(data.decode())
事例中输入为空(即len(msg==0))是不可以的,如果不输入任何东西,socket程序默认等待你的输入,所以程序会卡掉。
服务端:
# -*- coding: UTF-8 -*-import socket# 声明协议类型server = socket.socket()# 绑定本地网卡(多网卡选择),端口server.bind(('localhost', 8888))# 监听端口server.listen(5) # 监听while True: conn, address = server.accept() print("进入等待时间....") while True: print("收到连接....") # 接收数据 data_server = conn.recv(1024) if not data_server: # 这里判断客户端断开的情况,不控制会无限循环 print('client is lost...') break print('receive:', data_server.decode()) # 返回一个值 conn.send(data_server)
新闻热点
疑难解答