使用PyQt和Socket进行聊天编程[标准库]

时间:2012-01-14 16:20:27

标签: python sockets pyqt chat

我编写了一个程序,在客户端部分经常出现错误,我认为该错误来自socket中的client.py函数。我该怎么办?

server.py:

# This is my server code , this code has no problems
import asyncore
import socket

clients = {}

class MainServerSocket(asyncore.dispatcher):
    def __init__(self, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind(('',port))
        self.listen(5)
    def handle_accept(self):
        newSocket, address = self.accept( )
        clients[address] = newSocket
        print "Connected from", address
        SecondaryServerSocket(newSocket)

class SecondaryServerSocket(asyncore.dispatcher_with_send):
    def handle_read(self):
        receivedData = self.recv(8192)
        if receivedData:
            every = clients.values()
            for one in every:
                one.send(receivedData+'\n')
        else: self.close( )
    def handle_close(self):
        print "Disconnected from", self.getpeername( )
        one = self.getpeername( )
        del clients[one]

MainServerSocket(21567)
asyncore.loop( )

client.py:

from PyQt4 import QtGui , QtCore
from socket import *
import thread
import sys

HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.socket()

        roomLabel = QtGui.QLabel('room')

        self.browser = QtGui.QTextBrowser()
        self.browser.backwardAvailable

        self.textEdit = QtGui.QTextEdit()
        self.textEdit.setMaximumSize(QtCore.QSize(400,60))
        #4 edit line
        self.connect(self.browser, QtCore.SIGNAL("returnPressed()"),self.callback)

        SendButton = QtGui.QPushButton('Send')
        SendButton.setMaximumSize(QtCore.QSize(400,60))
        SendButton.clicked.connect(self.callback)




        layoutINlayout = QtGui.QHBoxLayout()
        layoutINlayout.addWidget(self.textEdit)
        layoutINlayout.addWidget(SendButton)


        widget = QtGui.QWidget()
        self.setCentralWidget(widget)

        self.layout = QtGui.QVBoxLayout()
        self.layout.addWidget(self.browser)

        mainwindow = QtGui.QVBoxLayout()
        mainwindow.addLayout (self.layout )
        mainwindow.addLayout (layoutINlayout )

        widget.setLayout(mainwindow)
        self.setWindowFlags(QtCore.Qt.WindowTitleHint )

    def callback(self, event):

        message = self.textEdit.toPlainText()
        tcpCliSock.send(message)



    def add(self, data):
        self.browser.setText(data)


    #i think the error comes from socket func:
    def socket(self):

        def loop0():
            while 1:
                print '1'
                data = tcpCliSock.recv(BUFSIZE)
                if data: self.add(data)

        thread.start_new_thread(loop0, ())


if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    app.setStyle('chat')


    window = MainWindow()
    window.setWindowTitle("pro IJ cracker v2")
    window.setWindowIcon(QtGui.QIcon("img/go.png"))
    window.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:5)

我的建议是

1)使用QThread

2)不要直接从另一个线程修改主线程中的小部件。相反,每次有数据时都会从QThread发出信号。

还有一些关于为什么当前线程设置崩溃的快速信息,请尝试包装并打印异常:

    def loop0():
        while 1:
            print '1'
            try:
                data = tcpCliSock.recv(BUFSIZE)
                if data: self.add(data)
            except Exception, e:
                print "ERROR:", e
                raise