如何解决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 举报,一经查实,本站将立刻删除。