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 datetime时间格式化去掉前导0
Jul 31 Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
python计算日期之间的放假日期
Jun 05 Python
python递归函数绘制分形树的方法
Jun 22 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
python获取Pandas列名的几种方法
Aug 07 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
python中urllib.request和requests的使用及区别详解
May 05 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的一个登录的类 [推荐]
2007/03/16 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
详解10分钟学会vue滚动行为
2017/09/21 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
深入解析Python中的urllib2模块
2015/11/13 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python ssh 执行shell命令的示例
2020/09/29 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
车间班组长岗位职责
2013/11/13 职场文书
学校七一活动方案
2014/01/19 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
演讲稿格式
2014/04/30 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技