Python -- 网络编程 -- Socket发送文件

客户端如果直接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_()

 

 

转载于:https://www.cnblogs.com/baijifeilong/p/3707115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值