Hướng dẫn single client multiple servers python - một ứng dụng khách nhiều máy chủ python

Bạn đang tìm hiểu về các mẫu không chặn trong Python vào đúng thời điểm;) Có rất nhiều cách để làm điều đó vì vậy tôi không thực sự ngạc nhiên khi bạn bối rối. Bạn đã đặt tên là

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
0, là khung trưởng thành nhất và cũng có
from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
1, được xây dựng thành Python 3+. Chọn cái nào là dễ nhất để bạn học. Như bạn có thể thấy, chúng rất giống nhau về phong cách.

asyncio_client.py

import asyncio
from uuid import uuid4

class Echo(asyncio.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connection_made(self, transport):
        message = '{}: hello world'.format(self.identity)
        transport.write(message.encode())

    def data_received(self, data):
        print(data.decode())

def echo_factory():
    return Echo()

async def connect_to_server(loop):
    await loop.create_connection(echo_factory, host='127.0.0.1', port=6000)

def main():
    loop = asyncio.get_event_loop()
    loop.create_task(connect_to_server(loop))
    loop.create_task(connect_to_server(loop))
    loop.create_task(connect_to_server(loop))
    loop.run_forever()

main()

twisted_client.py

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()

Hi,

Tôi đang đi qua các tài liệu để kết nối một máy khách Python duy nhất với nhiều máy chủ nút nhưng có nghi ngờ.

Tài liệu nêu rõ:

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
2
from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
2

Làm thế nào để bạn tạo ra một ổ cắm ZMQ mới?

Ngoài ra trong tệp readme, nó tuyên bố:

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
3

Có phải tôi đang hiểu sai sự khác biệt giữa hai tuyên bố?

Những công việc này:

import zerorpc

c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")

c1 = zerorpc.Client()
c1.connect("tcp://127.0.0.1:4444")

print(c.test())
print(c1.test())

Điều này không hiệu quả với tôi:

import zerorpc

c = zerorpc.Client()
c.bind("tcp://127.0.0.1:4242")

c1 = zerorpc.Client()
c1.bind("tcp://127.0.0.1:4444")

print(c.test())
print(c1.test())

Đây là hai máy chủ nút của tôi:

//SERVER 1
var zerorpc = require("zerorpc")

var server = new zerorpc.Server({
	test: function(reply){
		console.log("Server1: receiving from python")
		reply(null, "Hello from server one")
	}
})

server.bind("tcp://0.0.0.0:4242")

//SERVER 2
var zerorpc = require("zerorpc")

var server = new zerorpc.Server({
	test: function(reply){
		console.log("Server2: receiving from python")
		reply(null, "Hello from server Two")
	}
})

server.bind("tcp://0.0.0.0:4444")

Người học tốt! Trong hướng dẫn trước đây của chúng tôi, chúng tôi đã thảo luận về mô -đun Python Unittest. Hôm nay chúng ta sẽ xem xét ví dụ lập trình ổ cắm Python. Chúng tôi sẽ tạo máy chủ và ứng dụng máy khách Python Socket.

Lập trình ổ cắm Python

Để hiểu lập trình ổ cắm Python, chúng ta cần biết về ba chủ đề thú vị - máy chủ ổ cắm, máy khách ổ cắm và ổ cắm. Vậy, máy chủ là gì? Vâng, một máy chủ là một phần mềm chờ đợi các yêu cầu của khách hàng và phục vụ hoặc xử lý chúng phù hợp. Mặt khác, một khách hàng là người yêu cầu dịch vụ này. Yêu cầu chương trình khách hàng cho một số tài nguyên cho máy chủ và máy chủ đáp ứng yêu cầu đó. Ổ cắm là điểm cuối của kênh liên lạc hai chiều giữa máy chủ và máy khách. Các ổ cắm có thể giao tiếp trong một quy trình, giữa các quy trình trên cùng một máy hoặc giữa các quy trình trên các máy khác nhau. Đối với bất kỳ giao tiếp nào với một chương trình từ xa, chúng tôi phải kết nối thông qua cổng ổ cắm. Mục tiêu chính của hướng dẫn lập trình ổ cắm này là để giới thiệu cho bạn cách máy chủ ổ cắm và máy khách giao tiếp với nhau. Bạn cũng sẽ học cách viết chương trình Máy chủ Socket Python.Socket Server, Socket Client and Socket. So, what is a server? Well, a server is a software that waits for client requests and serves or processes them accordingly. On the other hand, a client is requester of this service. A client program request for some resources to the server and server responds to that request. Socket is the endpoint of a bidirectional communications channel between server and client. Sockets may communicate within a process, between processes on the same machine, or between processes on different machines. For any communication with a remote program, we have to connect through a socket port. The main objective of this socket programming tutorial is to get introduce you how socket server and client communicate with each other. You will also learn how to write python socket server program.

Ví dụ về ổ cắm Python

Chúng tôi đã nói trước đó rằng một máy khách ổ cắm yêu cầu một số tài nguyên cho máy chủ ổ cắm và máy chủ đáp ứng yêu cầu đó. Vì vậy, chúng tôi sẽ thiết kế cả mô hình máy chủ và máy khách để mỗi người có thể giao tiếp với chúng. Các bước có thể được xem xét như thế này.

  1. Chương trình máy chủ Python ổ cắm lúc đầu thực hiện và chờ mọi yêu cầu
  2. Chương trình máy khách Python Socket sẽ bắt đầu cuộc trò chuyện lúc đầu.
  3. Sau đó, chương trình máy chủ sẽ phản hồi phù hợp với các yêu cầu của khách hàng.
  4. Chương trình khách hàng sẽ chấm dứt nếu người dùng nhập tin nhắn của By Bye. Chương trình máy chủ cũng sẽ chấm dứt khi chương trình khách hàng chấm dứt, đây là tùy chọn và chúng tôi có thể giữ chương trình máy chủ chạy vô thời hạn hoặc chấm dứt với một số lệnh cụ thể trong yêu cầu của khách hàng.

Máy chủ ổ cắm Python

Chúng tôi sẽ lưu Chương trình Máy chủ Socket Python dưới dạng

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
4. Để sử dụng kết nối ổ cắm Python, chúng ta cần nhập mô -đun ổ cắm. Sau đó, tuần tự chúng ta cần thực hiện một số nhiệm vụ để thiết lập kết nối giữa máy chủ và máy khách. Chúng ta có thể lấy địa chỉ máy chủ bằng cách sử dụng hàm
from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
5. Nên cho địa chỉ cổng người dùng trên 1024 vì số cổng thấp hơn 1024 được dành cho giao thức Internet tiêu chuẩn. Xem mã ví dụ Máy chủ Socket Python bên dưới, các nhận xét sẽ giúp bạn hiểu mã.socket module. Then, sequentially we need to perform some task to establish connection between server and client. We can obtain host address by using
from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
5 function. It is recommended to user port address above 1024 because port number lesser than 1024 are reserved for standard internet protocol. See the below python socket server example code, the comments will help you to understand the code.

import socket


def server_program():
    # get the hostname
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # look closely. The bind() function takes tuple as argument
    server_socket.bind((host, port))  # bind host address and port together

    # configure how many client the server can listen simultaneously
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # receive data stream. it won't accept data packet greater than 1024 bytes
        data = conn.recv(1024).decode()
        if not data:
            # if data is not received break
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

Vì vậy, máy chủ ổ cắm Python của chúng tôi đang chạy trên cổng 5000 và nó sẽ đợi yêu cầu của khách hàng. Nếu bạn muốn máy chủ không thoát khi kết nối máy khách được đóng, chỉ cần xóa câu lệnh IF và ngắt điều kiện. Python trong khi vòng lặp được sử dụng để chạy chương trình máy chủ vô thời hạn và tiếp tục chờ đợi yêu cầu của khách hàng.

Máy khách Python ổ cắm

Chúng tôi sẽ lưu chương trình máy khách Python ổ cắm dưới dạng

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor

class Echo(protocol.Protocol):
    def __init__(self):
        self.identity = uuid4().hex

    def connectionMade(self):
        message = '{}: hello world'.format(self.identity)
        self.transport.write(message.encode())

    def dataReceived(self, data):
        print(data.decode())

def connect_to_server(factory):
    return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)

def main():
    factory = protocol.ClientFactory.forProtocol(Echo)
    connect_to_server(factory)
    connect_to_server(factory)
    connect_to_server(factory)
    reactor.run()

main()
6. Chương trình này tương tự như chương trình máy chủ, ngoại trừ ràng buộc. Sự khác biệt chính giữa chương trình máy chủ và máy khách là, trong chương trình máy chủ, nó cần liên kết địa chỉ máy chủ và địa chỉ cổng với nhau. Xem mã ví dụ máy khách Python Socket dưới đây, nhận xét sẽ giúp bạn hiểu mã.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Đầu ra lập trình ổ cắm Python

Để xem đầu ra, trước tiên hãy chạy chương trình máy chủ ổ cắm. Sau đó chạy chương trình máy khách ổ cắm. Sau đó, viết một cái gì đó từ chương trình khách hàng. Sau đó, một lần nữa viết trả lời từ chương trình máy chủ. Cuối cùng, viết Bye từ chương trình khách hàng để chấm dứt cả hai chương trình. Dưới đây, video ngắn sẽ cho thấy cách nó hoạt động trên các chương trình ví dụ về máy chủ và máy chủ của máy chủ và máy khách.bye from client program to terminate both program. Below short video will show how it worked on my test run of socket server and client example programs.

Hướng dẫn single client multiple servers python - một ứng dụng khách nhiều máy chủ python

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

Lưu ý rằng máy chủ ổ cắm đang chạy trên cổng 5000 nhưng máy khách cũng yêu cầu cổng ổ cắm để kết nối với máy chủ. Cổng này được gán ngẫu nhiên bởi cuộc gọi kết nối máy khách. Trong trường hợp này, nó 57822 Tham khảo: Tài liệu chính thức

Khách hàng có thể có nhiều máy chủ?

Có - bạn cần một ổ cắm cho mỗi kết nối. Ổ cắm là địa chỉ IP của máy khách + Cổng máy khách + Địa chỉ IP máy chủ + Kết hợp Cổng máy chủ. Nếu khách hàng đang nói chuyện với nhiều máy chủ, nó đang sử dụng nhiều cổng trên máy khách. Mỗi lần bạn kết nối () một ổ cắm, bạn đang phân bổ một cổng mới.. A socket is a client IP address + client port + server IP address + server port combination. If a client is talking to multiple servers, it is using multiple ports on the client machine. Each time you connect() a socket, you are allocating a new port.

Làm cách nào để kết nối nhiều máy khách với một máy chủ trong Python?

Kết nối nhiều máy khách trong Python, chúng tôi phải tạo một chức năng hoàn toàn mới và đặt tên cho nó Multi_Threaded_Client ();Điều này kết nối mọi máy khách từ địa chỉ khác nhau được cung cấp bởi máy chủ cùng một lúc.Trong hàm multi_threaded_client, kết nối.create a brand new function and name it multi_threaded_client() ; this connects every client from the various address provided by the server simultaneously. Within the multi_threaded_client function, the connection.

Khách hàng có thể có bao nhiêu ổ cắm?

Số lượng ổ cắm tối đa.Đối với hầu hết các giao diện ổ cắm, số lượng ổ cắm tối đa được phép cho mỗi kết nối giữa một ứng dụng và giao diện ổ cắm TCP/IP là 65535.65535.

Có thể chạy máy chủ và máy khách tương ứng trong cùng một máy để họ có thể giao tiếp không?

Vâng, nó hoàn toàn có thể.Mỗi hệ điều hành có giao diện loopback.Bạn có thể có nhiều máy khách kết nối với một máy chủ trên máy tính của mình.Loại giao tiếp này diễn ra trên giao diện Loopback.. Every OS has a loopback interface. You can have multiple clients connect to one server on your computer. This kind of communication takes place over the loopback interface.