2012-04-04 110 views
0

我創建使用PyQt.But我有奇怪的錯誤一個簡單的服務器/客戶端應用程序:爲什麼我無法更改self.filename?

這裏是我的服務器端代碼:

#! /usr/bin/python 
import sys 
import socket 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtNetwork import * 

HOST = '127.0.0.1' 
PORT = 9991 
SIZEOF_UINT32 = 4 

class Form(QDialog): 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.bind((HOST, PORT)) 
     self.socket.listen(5) 
     self.worker = Worker(self.socket) 

     self.connect(self.worker, SIGNAL("received"), self.updateUi) 
     self.connect(self.worker, SIGNAL("finished()"), self.updateUi) 
     self.connect(self.worker, SIGNAL("terminated()"), self.updateUi) 
     # Create widgets/layout 
     self.browser = QTextBrowser() 
     self.selectButton = QPushButton('Close server') 
     layout = QVBoxLayout() 
     layout.addWidget(self.browser) 
     layout.addWidget(self.selectButton) 
     self.setLayout(layout) 
     self.setWindowTitle("Server") 
     self.worker.start() 

    def updateUi(self, text): 
     self.browser.append(text) 


class Worker(QThread): 

    def __init__(self,socket,parent = None): 
     super(Worker, self).__init__(parent)   
     self.socket = socket  
     self.dir = '/home/jacos/down/' 
     self.filename = '/home/jacos/down/hello' 


    def receiveFile(self): 
     self.conn, self.addr = self.socket.accept()  
     totalData = '' 
     while 1: 
      data = self.conn.recv(1024) 
      if not data: break 
      totalData += data 
     print totalData 
     if totalData.find('f') == 0: 
      name = totalData.strip()[1:] 
      self.filename = self.dir + name 
      print self.filename 
     else: 
      self.saveFile(totalData) 
      print self.filename 
      self.emit(SIGNAL("received"),QString("received a file")) 

    def saveFile(self,data): 
     f = open(self.filename,'wb') 
     print self.filename 
     f.write(data) 
     f.close() 
     self.conn.close() 

    def run(self): 

     while 1: 
      self.receiveFile() 


app = QApplication(sys.argv) 
form = Form() 
form.show() 
app.exec_() 

當我運行它,我得到這個:

Traceback (most recent call last): 
    File "/home/jacos/bin/tss.pyw", line 75, in run 
    self.receiveFile() 
    File "/home/jacos/bin/tss.pyw", line 61, in receiveFile 
    self.saveFile(totalData) 
    File "/home/jacos/bin/tss.pyw", line 66, in saveFile 
    f = open(self.filename,'wb') 
TypeError: file() argument 1 must be encoded string without NULL bytes, not str 
TypeError: updateUi() takes exactly 2 arguments (1 given) 

的問題是所有關於self.filename.It看來我不能用正確的值傳遞...

這裏是我的客戶端代碼:

#! /usr/bin/python 
# -*- coding: utf8 -*- 
import sys 
import socket 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtNetwork import * 

HOST = '127.0.0.1' 
PORT = 9991 
SIZEOF_UINT32 = 4 

class Form(QDialog): 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 



     # Create widgets/layout 
     self.browser = QTextBrowser() 
     self.selectButton = QPushButton('Send a File') 
     self.connectButton = QPushButton("Connect") 
     self.connectButton.setEnabled(True) 
     layout = QVBoxLayout() 
     layout.addWidget(self.browser) 
     layout.addWidget(self.selectButton) 
     layout.addWidget(self.connectButton) 
     self.setLayout(layout) 

     # Signals and slots for line edit and connect button 
     self.selectButton.clicked.connect(self.sendFileName) 
     self.connectButton.clicked.connect(self.connectToServer) 

     self.setWindowTitle("Client") 

    # Update GUI 
    def updateUi(self, text): 
     self.browser.append(text) 



    def sendFileName(self): 
     filename=QFileDialog.getOpenFileName(self, 'Open File', '.')  
     name = filename.split('/')[-1]  
     self.updateUi("Sent file name:" + name) 
     self.socket.sendall("f" + name) 
     self.socket.close() 
     self.connectToServer() 
     self.sendFile(filename,name) 



    def sendFile(self,filename,name): 
     self.socket.sendall(open(filename,'rb').read()) 
     self.updateUi("Sent file:" + filename) 
     self.socket.close() 
     self.connectButton.setEnabled(True) 

    def connectToServer(self): 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.connect((HOST, PORT)) 
     self.connectButton.setEnabled(False) 
     self.updateUi("Connected") 





app = QApplication(sys.argv) 
form = Form() 
form.show() 
app.exec_() 

感謝您的任何幫助。

回答

2

你可能在self.filenameNULL字節(\0\x00),併爲錯誤指示,你不能打開一個文件包含NULL字節的名稱。事先妥善處理(例如:刪除,替換等)。

至於另一個錯誤:您將兩個信號(finishedterminated)連接到self.updateUi。這些信號沒有通過任何參數,而self.updateUi需要傳遞一個參數,即text。我不確定你的目標是什麼,但可以考慮在self.updateUi中爲text參數添加默認參數。

+0

你太棒了!但是'\ 0'是如何進入我的代碼?這很奇怪。我意識到我的第二個錯誤〜。非常感謝! – Gnijuohz 2012-04-05 00:10:46

+0

@Gnijuohz:恩,它來自你的插座。我不確定問題是什麼,但是看看你的客戶端代碼:'self'socket.sendall(「f」+ name)''中的'name'變量是'QString'或'unicode'。這可能有問題。嘗試編碼/將其轉換爲字符串。 – Avaris 2012-04-05 01:07:59

+0

我發現文件名也不能有中文字,我該怎麼解決呢? – Gnijuohz 2012-04-05 01:11:07

相關問題