用TCP同时连接两个进程之间的多进程连接

2024-09-25 00:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python编码方面的新手,我正在尝试学习多处理来解决我遇到的一个问题。在

我有一个项目与树莓pi(linux)和从另一个PC/设备(windows)我试图共享他们之间的数据与TCP连接。我做了服务器/客户机代码正在工作(服务器在树莓和客户机在PC机)。在

下一步是制作一个可视化应用程序(在本例中,我选择kivy),并通过这个应用程序将数据从我的PC直接连接到我的raspberry,PC是这里直接从python/kivy代码获得的客户机。在

问题是,当我在kivy应用程序中引入IP和端口时,脚本正在连接我,但是立即关闭服务器,我希望我的服务器一直保持活动状态。在

另一个问题是,假设服务器没有被代码杀死,在另一个名为send_data的函数中,我想将速度和角度变量发送到我的服务器,并且仍然连接到服务器,服务器仍然是活动的,所以我唯一的选择是多处理。在

raspberry上服务器的代码:

import socket

host = ''
port = int(input("Port: "))

speed = []
angle = []

def setupServer():
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   print ("Socket created")
   try:
      s.bind((host, port))
   except socket.error as msg:
      print(msg)
   print("Socket bind complete.")
   return s

def setupConnection():
   s.listen(1)
   conn, address = s.accept()
   print("Connected to: " +address[0] + ":" + str(address[1]))
   return conn

def dataTransfer(conn):
   global speed,angle

   data = conn.recv(1024)
   data = data.decode('utf-8')
   """ split the data """
   dataMessage = data.split(' ',1)
   speed = dataMessage[0]
   angle = dataMessage[1]

   print(speed)
   print(angle)

   if dataMessage[0] == 'exit':
       print("Client has left the server")
       break
   if dataMessage[0] == 'kill':
       print("Server is shutting down")
       s.close()
       break

   conn.close()


s = setupServer()

while True:
   try:
      conn = setupConnection()
      dataTransfer(conn)
   except:
      break

我的客户机使用kivy模块的代码:

^{pr2}$

kivy造型零件代码:

^{3}$

我想通过TCP连接来连接、断开连接和发送数据,所有这些都是在服务器一直处于活动状态(只有当我按下“停止服务器”按钮时服务器才应该关闭)。 显然kivy模块有一个奇怪的结构,我真的不明白如何在我的问题和kivy结构中分配多处理。在

你们中有人能看看我的代码,用多重处理来纠正我的代码,或者至少给我一个建议/教程或其他什么吗?在

更新:正如您所见,我还没有使用任何多处理代码,首先我尝试使用pool和map将连接部分划分为一个核心,而其余部分则位于另一个核心上,但是为了使服务器保持活动状态,我需要在连接区域中设置一个循环序列。(我的笔记本电脑只有2个核心)


Tags: 代码服务器应用程序data客户机addressdefsocket
1条回答
网友
1楼 · 发布于 2024-09-25 00:27:41

请改用threading。多处理基本上类似于启动另一个进程,除非写入文件,否则共享数据并不容易。有了线程,您可以在同一个进程中,并且可以访问线程之间的变量。
下面是一个如何实现线程的小例子。在

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
import threading

sock = socket.socket()
sock.connect((host, port))


KV = """

BoxLayout:
    Label:
        text: app.label_text

"""

class MyApp(App):
    label_text = StringProperty("")

    def build(self):
        threading.Thread(target=self.update_label).start()
        return Builder.load_string(KV)


    def update_label(self):
        while True:
            self.label_text = sock.recv(1025)


MyApp().run()

相关问题 更多 >