python通过socket实现多个连接并实现ssh功能详解


Posted in Python onNovember 08, 2017

一、前言

上一篇中我们已经知道了客户端通过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)

python通过socket实现多个连接并实现ssh功能详解

在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())

结果如下:

python通过socket实现多个连接并实现ssh功能详解

python通过socket实现多个连接并实现ssh功能详解

注: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()

结果:

python通过socket实现多个连接并实现ssh功能详解

 在socket_server.py文件位置处能看到上传的文件

python通过socket实现多个连接并实现ssh功能详解

总结

以上就是本文关于python通过socket实现多个连接并实现ssh功能详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python入门之三角函数全解【收藏】、Python基础练习之用户登录实现代码分享、python好玩的项目—色情图片识别代码分享等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

Python 相关文章推荐
Python实现栈的方法
May 26 Python
Python线程指南详细介绍
Jan 05 Python
Python的时间模块datetime详解
Apr 17 Python
python实现八大排序算法(2)
Sep 14 Python
Django实现组合搜索的方法示例
Jan 23 Python
python 为什么说eval要慎用
Mar 26 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
Django基础三之视图函数的使用方法
Jul 18 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
详解Python多线程下的list
Jul 03 Python
Python基础练习之用户登录实现代码分享
Nov 08 #Python
python实现简单中文词频统计示例
Nov 08 #Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 #Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 #Python
Python入门之三角函数全解【收藏】
Nov 08 #Python
Python入门之三角函数tan()函数实例详解
Nov 08 #Python
Python入门之三角函数sin()函数实例详解
Nov 08 #Python
You might like
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
python编写爬虫小程序
2015/05/14 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
python中Django文件上传方法详解
2020/08/05 Python
python实现计算器简易版
2020/12/17 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
大学生作弊检讨书
2014/02/19 职场文书
毕业设计指导教师评语
2014/12/30 职场文书