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爬虫之神器正则表达式
Nov 06 Python
python执行get提交的方法
Apr 29 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python Cookie 读取和保存方法
Dec 28 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
pandas DataFrame运算的实现
Jun 14 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
python创建字典及相关管理操作
Apr 13 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
第九节 绑定 [9]
2006/10/09 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
js获取内联样式的方法
2015/01/27 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
python遍历目录的方法小结
2016/04/28 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
详解python中*号的用法
2019/10/21 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python数据爬下来保存的位置
2020/02/17 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
Python os库常用操作代码汇总
2020/11/03 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
彪马英国官网:PUMA英国
2019/02/11 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
加强干部作风建设整改方案
2014/10/24 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
品德与社会教学反思
2016/02/24 职场文书
python实现简易名片管理系统
2021/04/11 Python
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
python游戏开发之pygame实现接球小游戏
2022/04/22 Python