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 相关文章推荐
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
Python松散正则表达式用法分析
Apr 29 Python
requests和lxml实现爬虫的方法
Jun 11 Python
python 设置文件编码格式的实现方法
Dec 21 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
python 输出上个月的月末日期实例
Apr 11 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 Python
python 串行执行和并行执行实例
Apr 30 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
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
Python中的tuple元组详细介绍
2015/02/02 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
小学新教师培训方案
2014/02/03 职场文书
写得不错的求职信范文
2014/07/11 职场文书
关于保护环境的建议书
2014/08/26 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
何玥事迹观后感
2015/06/16 职场文书
关于教师节的广播稿
2015/08/19 职场文书
小学生运动会广播
2015/08/19 职场文书
Echarts如何重新渲染实例详解
2022/05/30 Javascript