PyQ中的Serverclient连接

2024-04-25 08:41:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用PyQt编写一个simpe程序来处理服务器-客户机连接(1:1连接就足够了)。我能够编写socket部分,但是对于GUI我一无所知。 我只想有2个对话框,一个用于服务器,一个用于客户端(非常简单,只有1个按钮用于发送,文本字段用于键入消息)。我想从服务器向客户端发送一条消息,然后用另一条消息回复服务器。 你知道怎么开始吗?或者是一个样本代码? 谢谢你

代码:

GUI是由设计工程师创建的。在

from PyQt5 import QtCore, QtWidgets
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(353, 266)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(20, 30, 47, 13))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(80, 110, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.textEdit = QtWidgets.QTextEdit(Dialog)
        self.textEdit.setGeometry(QtCore.QRect(80, 20, 141, 71))
        self.textEdit.setObjectName("textEdit")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "Message:"))
        self.pushButton.setText(_translate("Dialog", "Send"))

这个对话框类:

^{pr2}$

服务器类:

class Server():
    def __init__(self):
        host = socket.gethostname()
        port = 5000
        server_socket = socket.socket()
        server_socket.bind((host, port))
        server_socket.listen(2)
        conn, address = server_socket.accept()
        print("Connection from: " + str(address))

        gui = Dialog(server_socket)
        gui.show()
        while True:
            data = conn.recv(1024).decode()
            if not data:
                break
            print("message: " + str(data))
        conn.close()

if __name__ == '__main__':
    server = Server()

客户端类:

class Client():
    def __init__(self):
        host = socket.gethostname()
        port = 5000
        client_socket = socket.socket()
        client_socket.connect((host, port))
        gui = Dialog(client_socket)
        gui.show()
        message = ""

        while message.lower().strip() != 'bye':

            data = client_socket.recv(1024).decode()
            print('message: ', data)

        client_socket.close()

if __name__ == '__main__':
    client = Client()

Tags: self服务器clientdataserverdefsocketlabel
1条回答
网友
1楼 · 发布于 2024-04-25 08:41:58

简单来说:

你的问题的结果是花费了大量的编码时间(大约2-3小时)。因此,一个小小的走过去,让你再次走上正确的道路,自己做下几步。在

  1. 本例中的main程序文件是对话框.py而不是客户端.py. 在
  2. 如果你构建/编译你的程序客户端.py不是吗客户端.pyd或者其他形式的图书馆。在windows上,Dialog将是可执行文件。在
  3. 重命名客户端.py进入LOGIN_GUI或引用其“本地登录”功能的东西,因为这是您要实现的。使用名称客户端.py用于远程日志记录(不同于服务器的GUI!)。 3.在对话中使用Pythonmultiprocessing。在

    3a.进程1运行main app

    3b.进程2运行客户端服务器

    3c.其他任务外包时间超过1-2秒(在主界面显示为“冻结”)。

  4. 在对话框.py=>;玛玛inAppNameisNOtDialog.py(避免脚本代码中出现混乱/打字错误)

如果像下面这样对服务器进行ThreadingMixIn样式的代码,则可以从两台不同的计算机登录。据我所知,这是pyqt5中不可用的工具。另请参见下面代码中的内联注释。在

服务器端(修改pythonsSocket-server ThreadingMixIn):

import socket
import threading
import SocketServer

# MyAwesomelyNamedServerScript.py

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):

        def func1(scr1):
            #put code that does something here.
            print 'func1 : %s' % scr1
            return scr1

        def funct2(scr2):
            #put code that does something here.
            print 'func2 : %s' % scr2
            return scr2


        # self.request is the TCP socket connected to the client
        cur_thread = threading.current_thread()
        data = self.request.recv(1024)

        # In the data package the IP from client. 
        # Extract and add to an IP list (e.g. max 2 connection.)
        # if/else statement: if max connection reached than report back "cannot connect... waiting in queue or something".
        # limiting the request also prevent DDos attacks from the start.

        data_proc = func1(data)       # do something once
        data      = func2(data_proc)  # do something twice

        response = "{}: {}".format(cur_thread.name, data)
        self.request.sendall(response)

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

def setupServer(ip = None, port = None, message = None):
    # Ip, port, message can be linked to below code if you want exernal input via GUI
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = server.server_address

    # Start a thread with the server   that thread will then start one
    # more thread for each request
    server_thread = threading.Thread(target=server.serve_forever)
    # Exit the server thread when the main thread terminates
    server_thread.daemon = True
    server_thread.start()
    print "Server loop running in thread:", server_thread.name
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        sock.sendall(message)
        response = sock.recv(1024)
        print "Received: {}".format(response)
    finally:
        sock.close()

def test_main():

        #client(ip, port, "Hello World 1")
        #client(ip, port, "Hello World 2")
        #client(ip, port, "Hello World 3")

        client(message = "Hello World 1")
        client(message = "Hello World 2")
        client(message = "Hello World 3")

        server.shutdown()
        server.server_close()

if __name__ == "__main__":

    test_main()  #runs the main test

在MainApp.py简言之:

^{pr2}$

相关问题 更多 >

    热门问题