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 ...
随机推荐
- New JVM Option Enables Generation of Mixed-Mode Flame Graphs
转自 https://www.infoq.com/news/2015/08/JVM-Option-mixed-mode-profiles Java has added a new launch opt ...
- Visual C++中的ADO编程
摘 要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法. 关键字:ADO:连接对象:OLE D ...
- hdu 2063 匈牙利算法
http://acm.hdu.edu.cn/showproblem.php?pid=2063 男女配对最大数 匈牙利算法模板 #include <cstdio> #include < ...
- (原创)Hibernate 使用过程中(尤其是多对多关联中的级联保存和级联删除)的注意事项(基于项目的总结)
一.先上知识点: 1.hibernate多对多关联关系中最重要的参数是(基于配置文件xxx.hbm.xml文件形式): 1):inverse属性,如果设置inverse=“true”就代表让对方参与维 ...
- mssql内存表
自MSSQL2014开始引入内存表. 怎样创建内存表: USE testGO ALTER DATABASE testADD FILEGROUP fg_test CONTAINS MEMORY_OPTI ...
- TFS Java SDK使用指南
[2018.3.6 更新] 最新版本的TFS Java SDK(14.123.1)支持Java SDK 1.6版本,可以从Oracle的官方网站(http://www.oracle.com/techn ...
- 3D空间中射线与三角形的交叉检测算法【转】
引言 射线Ray,在3D图形学中有很多重要的应用.比如,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检测等等都可以使用射线Ray来完成.所以,在本次博客中,将会简单的像大家介绍下,如 ...
- 深入理解Aspnet Core之Identity(2)
主题: 我将继续介绍Identity的账户简单管理,即是增删改查.我会只介绍增加和删除,修改功能代码我会上传到我的github上, 创建用户: 1.我在Model文件夹创建一个 CreateModel ...
- 【mysql】Windows环境搭建(适用5.7以上)
1 下载MySQL 登录 https://dev.mysql.com/downloads/mysql/ 2 配置 下载好了zip文件,解压至任意非中文目录,在根目录下新建my.ini: 输入以下内容( ...
- 网易云首席安全架构师谈安全新形势:DDOS两三天,游戏玩家数从几万降到几百
本文由 网易云发布. 安全是一个永恒的话题,在业务不断云化.攻击越来越复杂的当下,互联网安全呈现了出什么样的严峻形势?对这些形势,网易云又是如何应对的? 网易云首席安全架构师沈明星 4月13日,网易 ...