簡體   English   中英

如何在一個python代碼中運行兩個服務器

[英]How to run two servers in one python code

我嘗試在下面的一個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和socket編程的新手,謝謝

在線程模塊中,“ target”關鍵字參數不應包含方括號 ,請參見如何不等待線程在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)

同時,您可能需要將發送方2中的代碼更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM