京公网安备 11010802034615号
经营许可证编号:京B2-20210330
python通过socket实现多个连接并实现ssh功能详解
一、前言
上一篇中我们已经知道了客户端通过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,port
conn, 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)
在Linux服务器上,我开启了6个客户端,每个客户端输入一次就断开(即显示了client has lost...),服务端分别和六个客户端连接并接收数据。
四、实现ssh功能
4.1 测试环境
服务端: 172.16.200.49,监听端口('0.0.0.0', 8888),Linux系统
客户端:本机win10
4.2 测试代码
服务端:
# -*- coding: UTF-8 -*-
import socket
import os
# 声明协议类型
server = socket.socket()
# 绑定本地网卡(多网卡选择),端口
server.bind(('0.0.0.0', 8888))
# 监听端口
server.listen() # 监听
while True:
conn, address = server.accept()
print("进入等待时间....")
while True:
print("收到连接....")
# 接收数据
data_server = conn.recv(1024)
if not data_server:
print('client is lost...')
break
res = os.popen("{}".format(data_server.decode())).read() # 将执行命令的结果存储返回
# 返回结果
conn.send(res.encode('utf-8'))
客户端:
# -*- coding: UTF-8 -*-
import socket
# 客户端
# 声明协议类型,同时生成socket对象
client = socket.socket()
#
client.connect(('172.16.200.49', 8888)) # 服务端ip和端口
# python3 接收字节流数据
while True:
msg = input('>>:').strip()
if len(msg) == 0:
continue
client.send(msg.encode('utf-8'))
data = client.recv(1024) # 1024字节的数据
print(data.decode())
结果如下:
注:socket中recv()和send()函数接收和发送数据大小都是有限制的。如果一次发送太大,客户端接收不完,就会先存储在缓存当中。但是下一次命令,客户端接收的还是上次命令没有发完的数据。
四、模拟FTP上传文件
本例当服务端在Linux环境中,struck模块有些问题....,目前在win10中可以正常运行
服务端:
# -*- coding: UTF-8 -*-
import struct
import socket
class FtpServer(object):
def __init__(self, host, port):
self.host = host
self.port = port
def ftp_server(self):
# 声明协议类型
ftp_server = socket.socket()
# 绑定本地网卡(多网卡选择),端口
ftp_server.bind((self.host, self.port))
# 监听端口
ftp_server.listen() # 监听
while True:
print('等待...')
conn, address = ftp_server.accept()
while True:
file_info = struct.calcsize('128sl')
buf = conn.recv(file_info)
if buf:
file_name, file_size = struct.unpack('128sl', buf)
# 使用strip()删除打包时附加的多余空字符
file_new_name = file_name.decode().strip('\00')
print('start receiving...')
fw = open(file_new_name, 'wb')
received_size = 0 # 接收文件的大小
while not received_size == file_size:
if file_size - received_size > 1024:
r_data = conn.recv(1024)
received_size += len(r_data)
else:
r_data = conn.recv(file_size - received_size)
received_size = file_size
fw.write(r_data)
fw.close()
if __name__ == '__main__':
server = FtpServer('localhost', 8888)
server.ftp_server()
客户端:
# -*- coding: UTF-8 -*-
import socket
import os
import struct
class FtpClient(object):
# 定义一个FtpClien类
def __init__(self, host, port):
self.host = host
self.port = port
def client_push(self):
# 声明协议类型,同时生成socket对象
ftp_client = socket.socket()
# 连接服务端
ftp_client.connect((self.host, self.port))
while True:
# 切换文件目录路径
print("输入文件目录路径")
pwd = input(">>:").strip()
# 列出文件名称
files_list = os.listdir('{}'.format(pwd))
for i in files_list:
print(i)
file_name = input('输入上传的文件名:').strip()
file_path = os.path.join(pwd, file_name)
if os.path.isfile(file_path):
file_info = struct.calcsize('128sl') # 定义打包规则
f_head = struct.pack('128sl', file_name.encode('utf-8'), os.stat(file_path).st_size)
ftp_client.send(f_head)
fo = open(file_path, 'rb')
while True:
file_data = fo.read(1024)
if not file_data:
break
ftp_client.send(file_data)
fo.close()
# 上传文件
ftp_client.send(file_data)
# client.close()
if __name__ == '__main__':
client = FtpClient('localhost', 8888)
client.client_push()
结果:
在socket_server.py文件位置处能看到上传的文件
总结
以上就是本文关于python通过socket实现多个连接并实现ssh功能详解的全部内容,希望对大家有所帮助。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数字经济飞速发展的今天,数据分析已从“辅助工具”升级为“核心竞争力”,渗透到商业、科技、民生、金融等各个领域。无论是全 ...
2026-03-11上市公司财务报表是反映企业经营状况、盈利能力、偿债能力的核心数据载体,是投资者决策、研究者分析、从业者复盘的重要依据。16 ...
2026-03-11数字化浪潮下,数据已成为企业生存发展的核心资产,而数据思维,正是CDA(Certified Data Analyst)数据分析师解锁数据价值、赋 ...
2026-03-11线性回归是数据分析中最常用的预测与关联分析方法,广泛应用于销售额预测、风险评估、趋势分析等场景(如前文销售额预测中的多元 ...
2026-03-10在SQL Server安装与配置的实操中,“服务名无效”是最令初学者头疼的高频问题之一。无论是在命令行执行net start启动服务、通过S ...
2026-03-10在数据驱动业务的当下,CDA(Certified Data Analyst)数据分析师的核心价值,不仅在于解读数据,更在于搭建一套科学、可落地的 ...
2026-03-10在企业经营决策中,销售额预测是核心环节之一——无论是库存备货、营销预算制定、产能规划,还是战略布局,都需要基于精准的销售 ...
2026-03-09金融数据分析的核心价值,是通过挖掘数据规律、识别风险、捕捉机会,为投资决策、风险控制、业务优化提供精准支撑——而这一切的 ...
2026-03-09在数据驱动决策的时代,CDA(Certified Data Analyst)数据分析师的核心工作,是通过数据解读业务、支撑决策,而指标与指标体系 ...
2026-03-09在数据处理的全流程中,数据呈现与数据分析是两个紧密关联却截然不同的核心环节。无论是科研数据整理、企业业务复盘,还是日常数 ...
2026-03-06在数据分析、数据预处理场景中,dat文件是一种常见的二进制或文本格式数据文件,广泛应用于科研数据、工程数据、传感器数据等领 ...
2026-03-06在数据驱动决策的时代,CDA(Certified Data Analyst)数据分析师的核心价值,早已超越单纯的数据清洗与统计分析,而是通过数据 ...
2026-03-06在教学管理、培训数据统计、课程体系搭建等场景中,经常需要对课时数据进行排序并实现累加计算——比如,按课程章节排序,累加各 ...
2026-03-05在数据分析场景中,环比是衡量数据短期波动的核心指标——它通过对比“当前周期与上一个相邻周期”的数据,直观反映指标的月度、 ...
2026-03-05数据治理是数字化时代企业实现数据价值最大化的核心前提,而CDA(Certified Data Analyst)数据分析师作为数据全生命周期的核心 ...
2026-03-05在实验检测、质量控制、科研验证等场景中,“方法验证”是确保检测/分析结果可靠、可复用的核心环节——无论是新开发的检测方法 ...
2026-03-04在数据分析、科研实验、办公统计等场景中,我们常常需要对比两组数据的整体差异——比如两种营销策略的销售额差异、两种实验方案 ...
2026-03-04在数字化转型进入深水区的今天,企业对数据的依赖程度日益加深,而数据治理体系则是企业实现数据规范化、高质量化、价值化的核心 ...
2026-03-04在深度学习,尤其是卷积神经网络(CNN)的实操中,转置卷积(Transposed Convolution)是一个高频应用的操作——它核心用于实现 ...
2026-03-03在日常办公、数据分析、金融理财、科研统计等场景中,我们经常需要计算“平均值”来概括一组数据的整体水平——比如计算月度平均 ...
2026-03-03