无需线程的python中的多个客户端和服务器

时间:2018-10-12 18:52:14

标签: python-3.x client-server

我需要创建一个多客户端服务器程序,其中一个客户端将数据发送到服务器,而服务器会将数据发送到另一客户端。我不能使用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()

1 个答案:

答案 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)