我需要创建一个多客户端服务器程序,其中一个客户端将数据发送到服务器,而服务器会将数据发送到另一客户端。我不能使用Thread。我将客户端IP和客户端ID作为命令行参数传递,以在Ubuntu中指定客户端。但是我不明白如何绑定两个客户地址。这是我尝试过的下面的代码。
client.py:
import socket
import sys
from scapy.all import *
host = sys.argv[1]
port = 5000
id = sys.argv[2]
def Main():
host = sys.argv[1]
port = 5000
mySocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#mySocket.bind((host, port))
mySocket.connect((host, port))
p = IP(dst="127.0.0.1") / TCP(flags="S", sport=RandShort(), dport=80) / Raw("Hallo world!")
for i in range(1):
if id == 1:
recvData = mySocket.recv(1024)
print(recvData.decode())
else:
mySocket.send(bytes(p))
print("Packet sent")
mySocket.close()
if __name__ == '__main__':
Main()
Server.py:
import socket
from scapy.all import *
def Main():
host = '192.168.1.0'
port = 5000
mySocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mySocket.bind((host, port))
mySocket.listen(5)
for i in range(2):
conn, addr = mySocket.accept()
print("Connection from: " + str(addr))
data = conn.recv(1024)
if not data:
break
print("from connected user: " + str(data))
serverData = "reply from server"
conn.send(serverData.encode())
conn.close()
if __name__ == '__main__':
Main()
答案 0 :(得分:0)
不确定您在问题中描述的限制有什么意义。无论如何,您可以使用以下针对服务器和客户端的简单代码来执行所需的操作。请注意,实施非常糟糕且非常不灵活。但是,它不使用threading
。要运行它-启动server
(发送方),然后依次client_0
(接收方)和client_1
(发送方)。
服务器:
import socket
def main(ip, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind((ip, port))
clients = list()
for idx in range(2):
sock.listen()
conn, addr = sock.accept()
clients.append(conn)
print('client_{} connected: {}'.format(idx, addr))
data = b''
while True:
data_piece = clients[1].recv(1024)
if not data_piece:
break
data += data_piece
print(
'Received [{}] from client_1. Sending to client_0...'
.format(data.decode('UTF-8')))
clients[0].send(data)
print('stopped')
if __name__ == '__main__':
main('127.0.0.1', 5005)
client_0:
import socket
def main(ip, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((ip, port))
data = b''
while True:
data_piece = sock.recv(1024)
if not data_piece:
break
data += data_piece
print(
'Received [{}] from server.'
.format(data.decode('UTF-8')))
print('stopped')
if __name__ == '__main__':
main('127.0.0.1', 5005)
client_1:
import socket
def main(ip, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((ip, port))
print('Sending to server...')
sock.send('hello, world!'.encode('UTF-8'))
print('stopped')
if __name__ == '__main__':
main('127.0.0.1', 5005)