Python tcp传输代码实例解析


Posted in Python onMarch 18, 2020

socket是编程语言对tcp/ip协议的封装,使用其可以在两个主机之间传输文件,下面直接进入主题,下面示例是最简单的tcp传输代码示例,先启动server再启动client。需要注意python3socket只能传输byte类型,具体如何转换可以复习字符编码章节相关知识

sever端代码

# -*- coding:utf-8 -*-
import socket
server = socket.socket()
server.bind(("0.0.0.0", 8888))
server.listen(10)
while True: #循环监听连接过来的客户端
  conn,addr = server.accept()
  while True: #每个客户端连接过来以后持续交互,当客户端端断开后在和下一个客户端交互
    try:
      rec_data = conn.recv(4096) #4096接收缓冲区大小
      if len(rec_data) == 0:
        break
      print("rec_data:", rec_data.decode(encoding="utf-8"))
      conn.send(rec_data.upper())
    except ConnectionResetError as e:
      print("一个客户端关闭了连接")
      break
server.close()

client端代码

import socket
client = socket.socket()
client.connect(("127.0.0.1", 8888))
while True:
  msg = input()
  if len(msg) == 0:
    continue
  client.send(msg.encode(encoding="utf-8")) #如果发送中文需要对其进行encode,接收也需要decode;英文前面直接加b指定类型
  client_rec = client.recv(4096)
  print("client_rec:", client_rec)
client.close()

粘包解决方法:对于两条紧挨的send语句,会存在上一条send的内容与下一条send的内容混在一起的情况,这个是因为send只是将数据发送给os,具体os如何发送数据无法控制,使用下面方法能够解决两条send语句之间发送报文粘包问题

server端代码

import socket, os
server = socket.socket()
server.bind(("0.0.0.0", 8888))
server.listen(10)
while True: #循环监听连接过来的客户端
  conn,addr = server.accept()
  while True: #收到客户端发过来的get filename如果filename存在就将文件发出否则返回文件不存在
    try:
      rec_data = conn.recv(1024) #4096接收缓冲区大小
      if len(rec_data) == 0:
        break
      rec_str_list = rec_data.decode(encoding="utf-8").split(" ")
      filename = rec_str_list[-1]
      if os.path.isfile(filename):#判断文件在当前路径下存在句将文件传给客户端
        file_data = open(filename,encoding="utf-8").read()
        conn.send(str(len(file_data)).encode(encoding="utf-8")) #将文件长度传给客户端
        print(conn.recv(1024).decode(encoding="utf-8")) #客户端收到文件长度返回确认信息,server收到确认信息后再开始传送数据
        conn.sendall(file_data.encode(encoding="utf-8"))#将数据全部发个客户端,客户端判断数据接收完成后发送接收完成的信息
        print(conn.recv(1024).decode(encoding="utf-8")) #接收客户端接收完成的确认指令,避免两个send直接连在一起产生粘包
      else:#如果文件名不存在则返回文件不存在
        conn.send(b"file is not exit")
    except ConnectionResetError as e:
      print("一个客户端关闭了连接")
      break
server.close()

client端代码

import socket, os
#输入get 文件名,当文件存在server家目录下则返回文件,客户端将接收文件内容并打印,
client = socket.socket()
client.connect(("127.0.0.1", 8888))
while True:
  msg = input()
  if len(msg) == 0:
    continue
  client.send(msg.encode(encoding="utf-8")) #如果发送中文需要对其进行encode,接收也需要decode;英文前面直接加b指定类型
  client_rec = client.recv(1024).decode(encoding="utf-8")
  print("client_rec", client_rec)
  if client_rec == "file is not exit": #如果文件不存在则用户打印文件不存在,用户继续输入
    print(client_rec)
    continue
  client.send(client_rec.encode(encoding="utf-8"))#文件存在则将文件大小发回去
  rec_len = int(client_rec)
  print("rec_len", rec_len)
  file_len = 0
  new_file = open("new_file","a",encoding="utf-8")
  while file_len < rec_len:#开始循环接收文件直到接收的文件大小与server端发过来的大小一样,将接收到的数据写入新文件
    rec_data_tmp = client.recv(1024)
    file_len += len(rec_data_tmp)
    print("receive date len", file_len)
    new_file.write(rec_data_tmp.decode(encoding="utf-8"))
  client.send("receive all".encode(encoding="utf-8"))

client.close()

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

Python 相关文章推荐
python使用PIL模块实现给图片打水印的方法
May 22 Python
python简单实现旋转图片的方法
May 30 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
python框架django基础指南
Sep 08 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
python实现各种插值法(数值分析)
Jul 30 Python
python中栈的原理及实现方法示例
Nov 27 Python
Django重设Admin密码过程解析
Feb 10 Python
pytorch模型存储的2种实现方法
Feb 14 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
Python列表的索引与切片
Apr 07 Python
python实现用户名密码校验
Mar 18 #Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 #Python
Selenium启动Chrome时配置选项详解
Mar 18 #Python
python+selenium+Chrome options参数的使用
Mar 18 #Python
selenium WebDriverWait类等待机制的实现
Mar 18 #Python
Python socket处理client连接过程解析
Mar 18 #Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 #Python
You might like
关于php循环跳出的问题
2013/07/01 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
python将回车作为输入内容的实例
2018/06/23 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
python调用私有属性的方法总结
2020/07/24 Python
Pygame框架实现飞机大战
2020/08/07 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
高三家长寄语
2014/04/03 职场文书
副处级干部考察材料
2014/05/17 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL
V Rising 服务器搭建图文教程
2022/06/16 Servers