如何 运行 两个服务器合二为一 python 代码
How to run two servers in one python code
我尝试将两个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 的数据
我是 oop 和套接字编程的新手
谢谢
在线程模块中,"target"关键字参数不应包含方括号,
见 。应该是:
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
我尝试将两个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 的数据
我是 oop 和套接字编程的新手 谢谢
在线程模块中,"target"关键字参数不应包含方括号,
见
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