客户端如果直接send两次,一次发文件名,一次发文件内容
服务端接受的时候会一起接收,不知怎么分开发送,或者分开接收, 或者全部接收再解析内容
今天发现传送mp3文件的时候没问题,传送文本文件的话,以前标题和内容就黏糊一块了,今天似乎也没事,搞不懂
1.文件服务端(fileServer.py):
1 import sys, os, threading, socket 2 from PyQt4 import QtGui, QtCore 3 4 class ListenThread(threading.Thread): 5 """监听线程""" 6 def __init__(self, server, txt): 7 super(ListenThread, self).__init__() 8 self.server = server 9 self.txt = txt 10 self.files = ['FileServer.py'] 11 def run(self): 12 while 1: 13 # try: 14 self.client, addr = self.server.accept() 15 self.txt.append('连接来自{}:{}\n'.format(addr[0], addr[1])) 16 data = self.client.recv(1024).decode('utf-8') 17 self.txt.append('收到文件:{}\n'.format(data)) 18 file = os.open('D:/'+data[:3], os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_BINARY) 19 rdata = self.client.recv(1024) 20 while rdata: 21 os.write(file, rdata) 22 rdata = self.client.recv(1024) 23 os.close(file) 24 self.client.close() 25 self.txt.append('文件接受完成,客户端关闭\n') 26 # except: 27 # pass 28 # self.txt.append('连接关闭\n') 29 # break############## 30 31 class ControlThread(threading.Thread): 32 """控制线程""" 33 def __init__(self, txt): 34 super(ControlThread, self).__init__() 35 self.txt = txt 36 self.event = threading.Event() 37 self.event.clear() 38 def run(self): 39 self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 40 self.server.bind(('', 1051)) 41 self.server.listen(1) 42 self.txt.append('正在等待连接。。。\n') 43 self.lsn = ListenThread(self.server, self.txt) 44 self.lsn.setDaemon(True) 45 self.lsn.start() 46 self.event.wait() 47 self.server.close() 48 def stop(self): 49 self.event.set() 50 class MyWindow(QtGui.QWidget): 51 def __init__(self): 52 super(MyWindow, self).__init__() 53 self.setWindowTitle('文件服务器') 54 self.resize(485, 300) 55 56 self.btn1 = QtGui.QPushButton('开始监听') 57 self.btn2 = QtGui.QPushButton('结束监听') 58 self.txt = QtGui.QTextEdit() 59 60 grid = QtGui.QGridLayout() 61 grid.addWidget(self.btn1, 0, 0) 62 grid.addWidget(self.btn2, 0, 1) 63 grid.addWidget(self.txt, 1, 0, 1, 2) 64 self.setLayout(grid) 65 66 self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1) 67 self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2) 68 def onBtn1(self): 69 self.ctrl = ControlThread(self.txt) 70 self.ctrl.setDaemon(True) 71 self.ctrl.start() 72 def onBtn2(self): 73 self.ctrl.stop() 74 75 app = QtGui.QApplication(sys.argv) 76 mywindow = MyWindow() 77 mywindow.show() 78 app.exec_()
2.文件客户端(fileClient.py):
1 import sys, os, socket 2 from PyQt4 import QtGui, QtCore 3 4 class MyWindow(QtGui.QWidget): 5 def __init__(self): 6 super(MyWindow, self).__init__() 7 self.setWindowTitle('文件客户端') 8 self.resize(485, 300) 9 10 self.lblIp = QtGui.QLabel('IP') 11 self.lblPort = QtGui.QLabel('Port') 12 self.lblFile = QtGui.QLabel('File') 13 self.txtIp = QtGui.QLineEdit('127.0.0.1') 14 self.txtPort = QtGui.QLineEdit('1051') 15 self.txtFile = QtGui.QLineEdit() 16 self.btnBrowse = QtGui.QPushButton('浏览') 17 self.btnSend = QtGui.QPushButton('发送') 18 self.btnSend.setMaximumWidth(150) 19 20 grid = QtGui.QGridLayout() 21 grid.addWidget(self.lblIp, 0, 0) 22 grid.addWidget(self.lblPort, 1, 0) 23 grid.addWidget(self.lblFile, 2, 0) 24 grid.addWidget(self.txtIp, 0, 1) 25 grid.addWidget(self.txtPort, 1, 1) 26 grid.addWidget(self.txtFile, 2, 1) 27 grid.addWidget(self.btnBrowse, 2, 2) 28 grid.addWidget(self.btnSend, 3, 1) 29 self.setLayout(grid) 30 31 self.connect(self.btnBrowse, QtCore.SIGNAL('clicked()'), self.onBtnBrowse) 32 self.connect(self.btnSend, QtCore.SIGNAL('clicked()'), self.onBtnSend) 33 def onBtnBrowse(self): 34 filename = QtGui.QFileDialog.getOpenFileName(self, '打开文件', filter='全部文件(*.*)') 35 if filename: 36 self.txtFile.setText(filename) 37 38 def onBtnSend(self): 39 # try: 40 ip = self.txtIp.text() 41 port = self.txtPort.text() 42 filename = self.txtFile.text() 43 name = filename.split('/')[-1] 44 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 45 client.connect((ip, int(port))) 46 client.send(name.encode('utf-8')) 47 file = os.open(filename, os.O_RDONLY | os.O_EXCL | os.O_BINARY) 48 data = os.read(file, filename) 49 while data: 50 client.send(data) 51 data = os.read(file, 1024) 52 os.close(file) 53 client.close() 54 # except: 55 # pass 56 # print('发送错误!') 57 app = QtGui.QApplication(sys.argv) 58 mywindow = MyWindow() 59 mywindow.show() 60 app.exec_()