Python -- 网络编程 -- Socket发送文件
客户端如果直接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发送文件的更多相关文章
- python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- python网络编程-socket“粘包”(小数据发送问题)
一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- python网络编程socket /socketserver
提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...
- Day8 - Python网络编程 Socket编程
Python之路,Day8 - Socket编程进阶 本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...
- python --- 网络编程Socket
网络编程 定义:所为网络编程即是对信息的发送和接收. 主要工作: (1)发送端:将信息以规定的协议组装成数据包. (2)接收端:对收到的数据包解析,以提取所需要的信息. Socket:两个在网络上的程 ...
- Day10 Python网络编程 Socket编程
一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...
随机推荐
- (最小生成树 )还是畅通工程 -- HDU--1233
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- DFS剪枝处理HDU1010
http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意很好理解,不是最短路,而是dfs,虽然地图不算大,稍微注意一点的dfs也能险过,但是700+ms和78 ...
- 16、Docker的网络-host和none
16.1 none 创建一个容器使用网络none: [root@docker ~]# docker run -d --name test1 --network none busybox /bin/ ...
- CentOS7 Docker 安装
CentOS7 已经内置了docker ,可以直接安装 安装Docker 命令: sudo yum install -y docker 启动docker 命令: service docker st ...
- Spring Boot 2 实践记录之 条件装配
实验项目是想要使用多种数据库访问方式,比如 JPA 和 MyBatis. 项目的 Service 层业务逻辑相同,只是具体实现代码不同,自然是一组接口,两组实现类的架构比较合理. 不过这种模式却有一个 ...
- STM32的时钟配置随笔
以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...
- Lucene.net 全文检索数据库
#define Search using Lucene.Net.Analysis; using Lucene.Net.Analysis.Tokenattributes; using Lucene.Ne ...
- day 113 爬虫框架
基础配置
- python 带参与不带参装饰器的使用与流程分析/什么是装饰器/装饰器使用注意事项
一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技 ...
- Mac 切换到行首和行末的方法
苹果笔记本没有home键和end键 但是使用 command + 方向键左键可以回到行首, command + 方向键右键可以去到行末