客户端如果直接send两次,一次发文件名,一次发文件内容

服务端接受的时候会一起接收,不知怎么分开发送,或者分开接收, 或者全部接收再解析内容

今天发现传送mp3文件的时候没问题,传送文本文件的话,以前标题和内容就黏糊一块了,今天似乎也没事,搞不懂

1.文件服务端(fileServer.py):

 import sys, os, threading, socket
 from PyQt4 import QtGui, QtCore

 class ListenThread(threading.Thread):
     """监听线程"""
     def __init__(self, server, txt):
         super(ListenThread, self).__init__()
         self.server = server
         self.txt = txt
         self.files = ['FileServer.py']
     def run(self):
         while 1:
             # try:
                 self.client, addr = self.server.accept()
                 self.txt.append('连接来自{}:{}\n'.format(addr[0], addr[1]))
                 data = self.client.recv(1024).decode('utf-8')
                 self.txt.append('收到文件:{}\n'.format(data))
                 file = os.open('D:/'+data[:3], os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_BINARY)
                 rdata = self.client.recv(1024)
                 while rdata:
                     os.write(file, rdata)
                     rdata = self.client.recv(1024)
                 os.close(file)
                 self.client.close()
                 self.txt.append('文件接受完成,客户端关闭\n')
             # except:
                 # pass
                 # self.txt.append('连接关闭\n')
                 # break##############

 class ControlThread(threading.Thread):
     """控制线程"""
     def __init__(self, txt):
         super(ControlThread, self).__init__()
         self.txt = txt
         self.event = threading.Event()
         self.event.clear()
     def run(self):
         self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.server.bind(('', 1051))
         self.server.listen(1)
         self.txt.append('正在等待连接。。。\n')
         self.lsn = ListenThread(self.server, self.txt)
         self.lsn.setDaemon(True)
         self.lsn.start()
         self.event.wait()
         self.server.close()
     def stop(self):
         self.event.set()
 class MyWindow(QtGui.QWidget):
     def __init__(self):
         super(MyWindow, self).__init__()
         self.setWindowTitle('文件服务器')
         self.resize(485, 300)

         self.btn1 = QtGui.QPushButton('开始监听')
         self.btn2 = QtGui.QPushButton('结束监听')
         self.txt = QtGui.QTextEdit()

         grid = QtGui.QGridLayout()
         grid.addWidget(self.btn1, 0, 0)
         grid.addWidget(self.btn2, 0, 1)
         grid.addWidget(self.txt, 1, 0, 1, 2)
         self.setLayout(grid)

         self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1)
         self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2)
     def onBtn1(self):
         self.ctrl = ControlThread(self.txt)
         self.ctrl.setDaemon(True)
         self.ctrl.start()
     def onBtn2(self):
         self.ctrl.stop()

 app = QtGui.QApplication(sys.argv)
 mywindow = MyWindow()
 mywindow.show()
 app.exec_()

2.文件客户端(fileClient.py):

 import sys, os, socket
 from PyQt4 import QtGui, QtCore

 class MyWindow(QtGui.QWidget):
     def __init__(self):
         super(MyWindow, self).__init__()
         self.setWindowTitle('文件客户端')
         self.resize(485, 300)

         self.lblIp = QtGui.QLabel('IP')
         self.lblPort = QtGui.QLabel('Port')
         self.lblFile = QtGui.QLabel('File')
         self.txtIp = QtGui.QLineEdit('127.0.0.1')
         self.txtPort = QtGui.QLineEdit(')
         self.txtFile = QtGui.QLineEdit()
         self.btnBrowse = QtGui.QPushButton('浏览')
         self.btnSend = QtGui.QPushButton('发送')
         self.btnSend.setMaximumWidth(150)

         grid = QtGui.QGridLayout()
         grid.addWidget(self.lblIp, 0, 0)
         grid.addWidget(self.lblPort, 1, 0)
         grid.addWidget(self.lblFile, 2, 0)
         grid.addWidget(self.txtIp, 0, 1)
         grid.addWidget(self.txtPort, 1, 1)
         grid.addWidget(self.txtFile, 2, 1)
         grid.addWidget(self.btnBrowse, 2, 2)
         grid.addWidget(self.btnSend, 3, 1)
         self.setLayout(grid)

         self.connect(self.btnBrowse, QtCore.SIGNAL('clicked()'), self.onBtnBrowse)
         self.connect(self.btnSend, QtCore.SIGNAL('clicked()'), self.onBtnSend)
     def onBtnBrowse(self):
         filename = QtGui.QFileDialog.getOpenFileName(self, '打开文件', filter='全部文件(*.*)')
         if filename:
             self.txtFile.setText(filename)

     def onBtnSend(self):
         # try:
             ip = self.txtIp.text()
             port = self.txtPort.text()
             filename = self.txtFile.text()
             name = filename.split('/')[-1]
             client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             client.connect((ip, int(port)))
             client.send(name.encode('utf-8'))
             file = os.open(filename, os.O_RDONLY | os.O_EXCL | os.O_BINARY)
             data = os.read(file, filename)
             while data:
                 client.send(data)
                 data = os.read(file, 1024)
             os.close(file)
             client.close()
         # except:
             # pass
             # print('发送错误!')
 app = QtGui.QApplication(sys.argv)
 mywindow = MyWindow()
 mywindow.show()
 app.exec_()

Python -- 网络编程 -- Socket发送文件的更多相关文章

  1. python网络编程-socket发送大数据包问题

    一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...

  2. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  3. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  4. python网络编程-socket“粘包”(小数据发送问题)

    一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...

  5. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  6. python网络编程socket /socketserver

    提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...

  7. Day8 - Python网络编程 Socket编程

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  8. python --- 网络编程Socket

    网络编程 定义:所为网络编程即是对信息的发送和接收. 主要工作: (1)发送端:将信息以规定的协议组装成数据包. (2)接收端:对收到的数据包解析,以提取所需要的信息. Socket:两个在网络上的程 ...

  9. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

随机推荐

  1. Scala偏函数与部分函数

    函数 1.部分函数 部分应用函数(Partial Applied Function)是缺少部分参数的函数,是一个逻辑上概念. def sum(x: Int, y: Int, z: Int) = x + ...

  2. 【TypeScript】TypeScript 学习 1——基本类型

    TypeScript 是 JavaScript 的超集,TypeScript 经过编译之后都会生成 JavaScript 代码.TypeScript 最大的特点就是类型化,因此才叫做 TypeScri ...

  3. 【转】【译】【Win10】在你的程序标题栏中显示后退按钮

    原文地址:http://www.sharpgis.net/post/2015/05/21/Displaying-a-backbutton-in-your-app-window 免责声明:这篇文章基于 ...

  4. [ACM_数据结构] Color the ball [线段树水题][数组开大]

    Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次 ...

  5. Spring Boot 2 实践记录之 组合注解原理

    Spring 的组合注解功能,网上有很多文章介绍,不过都是介绍其使用方法,鲜有其原理解析. 组合注解并非 Java 的原生能力.就是说,想通过用「注解A」来注解「注解B」,再用「注解B」 来注解 C( ...

  6. INDEX--创建索引和删除索引时的SCH_M锁

    最近有一个困惑,生产服务器上有一表索引建得乱七八糟,经过整理后需要新建几个索引,再删除几个索引,建立索引时使用联机(ONLINE=ON)创建,查看下服务器负载(磁盘和CPU压力均比较低的情况)后就选择 ...

  7. SQL SERVER 2014--学习笔记1

    --======================================================= 在SQL SERVER 2014中,最吸引眼球的就是内存表和本地编译存储过程,在MS ...

  8. Cocos2d-三维拾取Ray-AABB碰撞检测算法【转】

    1.三维拾取技术 在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取 ...

  9. JS里关于特殊字符的转义

    重定向的url里含有百分号“%”,遇到了apache 找不到该文件的报错.通过查询相关文档,知道了原来是url里含有特殊字符要转码才能定位到正确的地址.比如"%"要转码为" ...

  10. python——回文函数(reversed)

    回文数:正向排列与反向排列所得结果是相等的(即从左到右和从右到左的结果是相等的),例如:“123321”,“0000”等. reversed函数:反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭 ...