gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:04 25 4
gpt4 key购买 nike

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

服务器.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( )

客户端.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) 使用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

关于python - 使用 PyQt 和 Socket 进行聊天编程 [标准库],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com