Python socket模块方法实现详解


Posted in Python onNovember 05, 2019

这篇文章主要介绍了Python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

socket ssh (不带防止粘包的方法)

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket
import os

server = socket.socket()
server.bind(('localhost', 6969)) #绑定被监听端口
server.listen(5)  #监听端口
while True:
  print("我要开始等电话了")
  conn, addr = server.accept() # 就是等待的意思
  #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
  print("电话来了%s"% [conn, addr])
  while True:
    data = conn.recv(1024)
    if not data:
      print('client is lost.')
      break
    # res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
    # with open('filename', 'r') as ret: #这两行就 可以用过来传输文件了。
    #   data = ret.read()
    print('receive:',data)
    conn.send(data.upper())
server.close()

socket client 模块

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket


client = socket.socket() #声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))  #localhost就是本机地址

while True:
  msg = input('input msg >>:').strip()
  if len(msg) == 0: continue #检查msg的信息,防止无输入信息
  #client.send(b"Hello, world!") #发送信息
  client.send(msg.encode('utf-8'))

  data = client.recv(1024) #默认接受1024字节,就是1k
  # with open('filename', 'w') as ret: # 这两行就 可以用过来传输文件了。
  #   ret = data.write()
  print(data.decode())
client.close() #关闭端口

防止粘包的socket_ssh.py

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket
import os

server = socket.socket()
server.bind(('localhost', 6969)) #绑定被监听端口
server.listen(5)  #监听端口
while True:
  print("我要开始等电话了")
  conn, addr = server.accept() # 就是等待的意思
  #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例

  while True:
    data = conn.recv(1024).decode()
    print("电话来了%s" % type(data))
    # if type(data) is str:
    #   data = data.strip()
    if not data:
      print('client is lost.')
      break
    cmd_res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
    cmd_res_size = str(len(cmd_res.encode("utf-8")))
    print("before send",len(cmd_res),"size after encode", cmd_res_size)
    if len(cmd_res) == 0:
      print("there is no output.")
      res_warning = "there is no output."
      conn.send(res_warning.encode("utf-8"))
      continue
    else:
      conn.send(cmd_res_size.encode("utf8"))
      print(conn.recv(1024).decode()) #通过接收数据的形式来强制发送缓冲区的数据,防止粘包。
    # with open('filename', 'r') as ret: #这两行就 可以用过来传输文件了。
    #   data = ret.read()
    #print('receive:',data)
    print('receive:', data)
    conn.send(cmd_res.encode("utf-8"))
    # conn.send(bytes(cmd_res)) #不可行。传输的时候是需要encoding
server.close()

socket_client.py

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Ian Ying
# mail: kongqing.ying@yitu-inc.com

import socket


client = socket.socket() #声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))  #localhost就是本机地址

while True:
  msg = input('input msg >>:').strip()
  if len(msg) == 0: continue #检查msg的信息,防止无输入信息
  #client.send(b"Hello, world!") #发送信息
  client.send(msg.encode('utf-8'))
  received_size = client.recv(1024).decode() #用来记录接受的数据大小
  print("接收的数据大小", received_size)
  received_cont = b''
  received_cont_size = 0 # 用来判断接受数据的大小
  if received_size != "there is no output." :
    client.send("准备好了,可以发送。".encode()) #发送确认信息,以防止粘包
    received_size = int(received_size) #数据需要变成int才能进行判断
    while received_size != received_cont_size: #判断encode后的长度是否一致。
      received_cont_for_test = client.recv(1024)
      received_cont_size += int(len(received_cont_for_test))
      received_cont = received_cont + received_cont_for_test
      print("当前结束后的数据大小为:", received_cont_size)
      # print(received_cont_size)
    else:
      print("数据接收完成,接收的数据大小为:", received_cont_size)
      print("接收的内容为:\n",received_cont.decode(),"\n")
  else:
    print("output:\n", received_size)
    # data = client.recv(1024) #默认接受1024字节,就是1k
    # with open('filename', 'w') as ret: # 这两行就 可以用过来传输文件了。
    #   ret = data.write()
    # print(data.decode())
    # print(str(data))
client.close() #关闭端口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自动扫雷实现方法
Jul 25 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
Python带动态参数功能的sqlite工具类
May 26 Python
Python实现的txt文件去重功能示例
Jul 07 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
pandas 时间格式转换的实现
Jul 06 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
pytorch索引查找 index_select的例子
Aug 18 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
如何基于python实现不邻接植花
May 01 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
基于python3 的百度图片下载器的实现代码
Nov 05 #Python
Python hashlib模块加密过程解析
Nov 05 #Python
python set集合使用方法解析
Nov 05 #Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 #Python
python中删除某个元素的方法解析
Nov 05 #Python
Django 框架模型操作入门教程
Nov 05 #Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 #Python
You might like
ip签名探针
2006/10/09 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
python 自动批量打开网页的示例
2019/02/21 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
记帐员岗位责任制
2014/02/08 职场文书
建设工程授权委托书
2014/09/22 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
Python如何识别银行卡卡号?
2021/06/10 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL