Kivy Android应用程序中奇怪的扭曲客户端行为

问题描述

我想指出,客户端可以在Windows和Ubuntu上正常工作。以下问题仅在Android平台上发生。

这是一个连接到服务器的简单Kivy客户端(为此我使用了Twisted)。 按下“登录”按钮后,客户端首先发送一堆数据,其中包含服务器验证客户端所需的数据。服务器接受该客户端后,一切就继续进行。 服务器所需的初始化数据以重载的 connectionMade()方法发送。 问题是在android下,我构造的初始化消息发送了两次。一个在另一个之下,它会引起小混乱:( 我不知道为什么在Windows或Ubuntu上运行的同一客户端仅发送一次,而在Android上发送两次。

示例:

from kivy.support import install_twisted_reactor
install_twisted_reactor()

from twisted.internet import reactor,protocol

from kivy.app import App
from kivy.config import Config

from kivy.clock import Clock
from kivy.uix.label import Label
from kivy.uix.popup import Popup



class GdcClient(protocol.Protocol):

    def connectionMade(self):     
        #structure of the content of the authorization message
        servip = self.factory.app.root.ids.ip_.text
        port = int(self.factory.app.root.ids.port_.text)
        nick = self.factory.app.root.ids.nickname_.text
        passw = self.factory.app.root.ids.password_.text
        #header
        data_len_and_passw = f"{str(len('B') + len(nick) + len('auth')+2)}:{passw}"
        header_tmp = f"{data_len_and_passw:<{GdcApp.HEADER_LENGTH}}".encode("utf-8")
        #data
        data_tmp = f"{'B'}:{nick}:{'auth'}".encode("utf-8")

        self.transport.write(header_tmp + data_tmp)
        ###### HERE IS THE PROBLEM ######
        self.factory.app.on_connect(self.transport)


    def dataReceived(self,data):
        self.factory.app.on_message(data)



class GdcClientFactory(protocol.ClientFactory):
    protocol = GdcClient

    def __init__(self,app):
        self.app = app



class GdcApp(App):
    HEADER_LENGTH = 25

    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.servip = None
        self.port = None
        self.nick = None
        self.passw = None


    def connect(self):
        self.servip = self.root.ids.ip_.text.strip()
        self.port = self.root.ids.port_.text.strip()
        self.nick = self.root.ids.nickname_.text.strip()
        self.passw = self.root.ids.password_.text.strip()

        ###### HERE IS THE PROBLEM ######
        reactor.connectTCP(self.servip,int(self.port),GdcClientFactory(self))


    def disconnect(self):
        if self.conn:
            self.conn.loseConnection()
            del self.conn
        self.root.current = "login"


    def send_msg(self,msg_):
        msg = msg_
        #constructing the content of the message
        #header
        data_len_and_passw = f"{str(len('B') + len(self.nick) + len(msg)+2)}:"
        header_tmp = f"{data_len_and_passw:<{GdcApp.HEADER_LENGTH}}".encode("utf-8")
        #data
        data_tmp = f"{'B'}:{self.nick}:{msg}".encode("utf-8")
        self.conn.write(header_tmp + data_tmp)


    def on_connect(self,conn):
        self.conn = conn
        self.root.current = "secondscreen"


    def on_message(self,msg):
        pass


    def quit_app(self):
        App.get_running_app().stop()
      

    def build(self):
        self.title = "Test Client"




if __name__ == "__main__":
    Config.set("input","mouse","mouse,multitouch_on_demand")    
    gdc = GdcApp()
    gdc.run()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...