微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

kivy 应用程序在使用 Clock.schedule_interval 和套接字时崩溃

如何解决kivy 应用程序在使用 Clock.schedule_interval 和套接字时崩溃

当我运行以下文件时,kivy 应用程序停止工作并崩溃而没有给出错误

服务器.py

import socket
import threading

#Constants
IP = socket.gethostbyname(socket.gethostname())
port = 5455

#Servers
server = socket.socket(socket.AF_INET,socket.soCK_STREAM)
server.bind((IP,port))
print("Connection Established")

#listening
server.listen()
print("Start Listening...")

def on_connection(client_socket):
    client_socket.send(b'Hello bro what"s up')

while True:
    client_socket,addr = server.accept()

    if client_socket:
        thread = threading.Thread(target=on_connection,args=(client_socket,))
        thread.start()

Client.py(Kivy 文件

from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivy.clock import Clock
import socket

class ClientSide(MDFloatLayout):

    #Constants
    HEADER_LENGTH = 20

    def __init__(self,**kwargs):
        super(ClientSide,self).__init__(**kwargs)

        #Connection Constants
        IP = socket.gethostbyname(socket.gethostname())
        port = 5455

        #Connectiong to server
        self.client_socket = socket.socket(socket.AF_INET,socket.soCK_STREAM)
        self.client_socket.connect( (IP,port) )

        print('Running main event')
        self.main_event = Clock.schedule_interval(self.join_meeting,1/10000000000000000000)

    def join_meeting(self,dt):

        try:

            received_info = self.client_socket.recv(self.HEADER_LENGTH)
            print(received_info)

        except:
            pass

class Run(MDApp):
    def build(self):
        return ClientSide()

Run().run()

我尝试在另一个 clock.schedule_once 中运行 Clock.schedule_interval,但结果相同。

请帮助修复此错误

解决方法

您的代码没有崩溃,只是在等待。您的服务器循环接受连接并在获得连接时发送一些字节。但它只能获得一个连接,因为您的客户端只建立一个连接。然后服务器等待另一个连接。客户端在建立一个连接后读取服务器发回的字节,然后等待来自服务器的更多字节。在这一点上,每个人都在等待。

您可以通过让您的客户建立更多连接来解决此问题:

class ClientSide(MDFloatLayout):

    #Constants
    HEADER_LENGTH = 20

    def __init__(self,**kwargs):
        super(ClientSide,self).__init__(**kwargs)

        # #Connection Constants
        # IP = socket.gethostbyname(socket.gethostname())
        # port = 5455
        #
        # #Connectiong to server
        # self.client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # self.client_socket.connect( (IP,port) )

        print('Running main event')
        self.main_event = Clock.schedule_interval(self.join_meeting,1)

    def join_meeting(self,dt):
        try:
            # Connection Constants
            IP = socket.gethostbyname(socket.gethostname())
            port = 5455

            # Connectiong to server
            self.client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.client_socket.connect((IP,port))

            received_info = self.client_socket.recv(self.HEADER_LENGTH)
            print(received_info)
            self.client_socket.close()

        except:
            pass

上面的代码现在在每次执行 join_meetin() 时建立一个新连接。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。