问题描述
我想指出,客户端可以在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 (将#修改为@)