Как запустить два сервера в одном коде Python - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь сделать два сервера прослушивания udp в одном коде Python, код ниже,

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 в программе приема

Я новичок в программировании сокетов и сокетов. спасибо

1 Ответ

1 голос
/ 12 марта 2019

В поточном модуле аргумент ключевого слова target не должен содержать скобок , см. Как НЕ ждать окончания потока в Python .Как и должно быть:

threading.Thread(target=server1.startserver)

Затем два потока 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:
               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
...