2012-04-04 14 views
0

私はPythonソケットプログラミングとPyQtを使用して簡単なサーバー/クライアントアプリケーションを作成したいと思います。クライアントはサーバー側にファイルを送信できます。それは働いていました。私のサーバー側のGUIはどこですか?(pyqtを使って)スレッドを使うべきでしょうか?

Dikeiのアドバイスを取った後、私はソケット部分を扱う新しいスレッドを作成することでサーバーのサイドコードを変更しました。ここで

は私のサーバー側のコードです:ここ

#! /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 = 9996 
SIZEOF_UINT32 = 4 

class Form(QDialog): 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 
     self.worker = Worker() 
     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") 

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


class Worker(QThread): 

    def __init__(self,parent = None): 
     super(Worker, self).__init__(parent) 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    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 
     f = open('/home/jacos/downfrom','w') 
     f.write(totalData) 
     f.close() 
     self.emit(SIGNAL("received"),"received a file") 
     self.conn.close() 

    def run(self): 
     self.socket.bind((HOST, PORT)) 
     self.socket.listen(5) 
     while 1: 
      self.receiveFile() 



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

は私のクライアント側のコードです:

#! /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 = 9996 
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.sendFile) 
     self.connectButton.clicked.connect(self.connectToServer) 

     self.setWindowTitle("Client") 

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



    def sendFile(self): 
     filename=QFileDialog.getOpenFileName(self, 'Open File', '.') 
     self.socket.sendall(open(filename,'rb').read()) 
     self.updateUi("Sent a 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_() 

問題は、次のとおりです。

  1. 私のサーバー側のGUIが表示されません。私は理解していません なぜですか?スレッドを使うべきですか?
  2. また、サーバーはファイルを固定された場所に固定された という名前で保存します。サーバー側の場所を指定する方法はありますか? クライアント側から元のファイル名を取得しますか?

編集:今#1が解決されるが、スレッドによって放出される信号がすべてで、サーバーのブラウザはまったく更新されないキャッチされていないようです。

まだ#2は解決されていません。

ありがとうございました!

答えて

1

あなたのプログラムが無限ループform.show()は到達しません

while 1: 
    self.receiveFile() 

で立ち往生しています。 おそらく、別のスレッドですべてを行い、GUIを実行するメインスレッドにシグナルを送り返すべきです。

第2の問題は、データを送信する前にファイル名を最初に送信できることです。サーバーがファイル名を受け取ると、ワーカースレッドはシグナルを出力します。この信号はメインスレッドをトリガーしてQFileDialogをポップアップして、あなたがフォルダを選択できるようにします。フォルダーが選択されると、メインスレッドはフォルダーパスを持つ信号をワーカースレッドに送信し、ワーカースレッドはファイルを保存できます。

+0

スレッドを追加しましたが、信号がまったく受信されていないように見えました。もう一度サーバー側のコードを確認できますか? – Gnijuohz

+0

ワーカースレッドを開始する部分が表示されません。 – Dikei

+0

母...ありがとう、私は間違いを訂正しました。問題#2についてご存じですか? – Gnijuohz

関連する問題