0

PyQt を使用して単純なサーバー/クライアント アプリを作成しましたが、奇妙なエラーが発生しました。

ここに私のサーバー側のコードがあります:

#! /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に関するものです。正しい値で渡すことができないようです...

ここに私のクライアント側のコードがあります:

#! /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_()

助けてくれてありがとう。

4

1 に答える 1

2

おそらくNULLバイト(\0または\x00)がself.filenameあり、エラーが示すように、バイトを含む名前のファイルを開くことはできませんNULL。事前に適切に対処してください(例:取り外し、交換など)。

その他のエラーについて:2つの信号(finishedおよびterminated)をに接続していself.updateUiます。そして、これらのシグナルには引数が渡​​されませんがself.updateUi、引数が渡されることを期待します。つまり、text。目標が何であるかはわかりませんが、のtextパラメータにデフォルトの引数を追加することを検討してくださいself.updateUi

于 2012-04-04T18:31:39.030 に答える