【问题标题】:How to run two servers in one python code如何在一个 python 代码中运行两台服务器
【发布时间】:2019-08-01 15:56:45
【问题描述】:

我尝试在一个python代码中创建两个udp监听服务器,代码如下,

import threading
import time
import socket

class udpreceive:
      def __init__(self,port,ip):
           self.port = port
           self.ip = ip
           self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
           self.sock.bind((self.ip, self.port))

      def startserver(self):
           while True:
           time.sleep(1)
           data, addr = self.sock.recvfrom(1024)
           print (data)

server1 = udpreceive(514,"192.168.1.5")
s1 =  threading.Thread(target=server1.startserver())

server2 = udpreceive(515,"192.168.1.5")
s2 =  threading.Thread(target=server2.startserver())

s2.start()
s1.start()

这是 udp 发送方 1 的客户端代码

import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
counter =0
while True:
   send_data = "hellow world server1 :- "+ str(counter)
   sock.sendto(send_data.encode(), ("192.168.1.5", 514))
   print (send_data)
   counter +=1

这是发件人 2 的客户端代码

import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
counter =0
while True:
   send_data = "hellow world server2 :- "+ str(counter)
   sock.sendto(send_data.encode(), ("192.168.1.5", 514))
   print (send_data)
   counter +=1

当我运行接收代码时,它只显示发件人 1 数据。仅启动发件人 2 并开始接收代码,但它不显示任何发件人 2 发送数据,但我启动发件人 1 接收代码显示发件人 1 数据。

我做错了什么?我需要在接收程序中同时显示发件人 1 和发件人 2 的数据

我是 oop 和套接字编程的新手 谢谢

【问题讨论】:

  • 它是 UDP,两个发送者只需要一个接收器。您可能想要更改其中之一的消息。目前它们是相同的,消息可能难以识别。
  • 哦,我的糟糕,我忘了在这个中更改它。但我的代码在代码 2 中有地狱世界服务器 2,在代码 1 中有地狱世界服务器 1。我编辑它,谢谢我只运行发件人 2 并启动监听器。但发件人 2 的详细信息未捕获:(

标签: python python-3.x sockets udp python-multithreading


【解决方案1】:

在线程模块中,“target”关键字参数不应包含括号, 见How NOT to wait for a thread to finish in Python。应该是这样的:

threading.Thread(target=server1.startserver)

然后,两个 UDP 服务器线程应该启动然后加入,因为公平共享 CPU 资源很重要(尤其是在使用无限循环时)。

服务器的代码可以是:

import threading
import time
import socket

class udpreceive:
     def __init__(self,port,ip):
          self.port = port
          self.ip = ip
          self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
          self.sock.bind((self.ip, self.port))

     def startserver(self):
          while True:
               data, addr = self.sock.recvfrom(1024)
               print(f'port {self.port} receives {data}')

s1 = udpreceive(514, "192.168.1.5")
s2 = udpreceive(515, "192.168.1.5")
threads = [threading.Thread(target=s1.startserver), threading.Thread(target=s2.startserver)]

for th in threads:
     th.start()
     print(f'threads {th} started')
     th.join(0.1)

同时,您可能需要将 sender 2 中的代码更改为:

sock.sendto(send_data.encode(), ("192.168.1.5", 515)) # Send to port 515, not 514

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2020-08-13
    • 2014-11-09
    • 2022-11-18
    • 2012-03-08
    相关资源
    最近更新 更多