问题描述
当我运行以下文件时,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()
时建立一个新连接。