it-swarm.com.de

Python Socket Mehrere Clients

Ich arbeite also an einer iPhone-App, die einen Socket benötigt, um mehrere Clients für Online-Spiele zu bedienen. Ich habe Twisted ausprobiert, und mit viel Mühe habe ich es nicht geschafft, eine Reihe von Informationen auf einmal zu senden, weshalb ich jetzt den Socket-Versuch unternehme.

Meine Frage ist, wie können Sie mit dem folgenden Code mehrere Clients miteinander verbinden? Ich habe Listen ausprobiert, aber ich kann das Format dafür nicht herausfinden. Wie kann dies erreicht werden, wenn mehrere Clients gleichzeitig verbunden sind und ich eine Nachricht an einen bestimmten Client senden kann?

Vielen Dank!

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module
s = socket.socket()         # Create a socket object
Host = socket.gethostname() # Get local machine name
port = 50000                # Reserve a port for your service.

print 'Server started!'
print 'Waiting for clients...'

s.bind((Host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
c, addr = s.accept()     # Establish connection with client.
print 'Got connection from', addr
while True:
   msg = c.recv(1024)
   print addr, ' >> ', msg
   msg = raw_input('SERVER >> ')
   c.send(msg);
   #c.close()                # Close the connection
22
Alec

Basierend auf Ihrer Frage:

Meine Frage ist, wie können Sie mit dem folgenden Code mehrere Clients miteinander verbinden? Ich habe Listen ausprobiert, aber ich kann das Format dafür nicht herausfinden. Wie kann dies erreicht werden, wenn mehrere Clients gleichzeitig verbunden sind und ich eine Nachricht an einen bestimmten Client senden kann?

Mit dem von Ihnen angegebenen Code können Sie Folgendes tun: 

#!/usr/bin/python           # This is server.py file                                                                                                                                                                           

import socket               # Import socket module
import thread

def on_new_client(clientsocket,addr):
    while True:
        msg = clientsocket.recv(1024)
        #do some checks and if msg == someWeirdSignal: break:
        print addr, ' >> ', msg
        msg = raw_input('SERVER >> ')
        #Maybe some code to compute the last digit of PI, play game or anything else can go here and when you are done.
        clientsocket.send(msg)
    clientsocket.close()

s = socket.socket()         # Create a socket object
Host = socket.gethostname() # Get local machine name
port = 50000                # Reserve a port for your service.

print 'Server started!'
print 'Waiting for clients...'

s.bind((Host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.

print 'Got connection from', addr
while True:
   c, addr = s.accept()     # Establish connection with client.
   thread.start_new_thread(on_new_client,(c,addr))
   #Note it's (addr,) not (addr) because second parameter is a Tuple
   #Edit: (c,addr)
   #that's how you pass arguments to functions when creating new threads using thread module.
s.close()

Wie Eli Bendersky erwähnt, können Sie Prozesse anstelle von Threads verwenden. Sie können auch das Modul python threading oder ein anderes async-Sockets-Framework überprüfen. Hinweis: Sie müssen prüfen, wie Sie möchten, und dies ist nur ein grundlegender Rahmen.

21
Julian Chukwu

accept kann ständig neue Clientverbindungen bereitstellen. Beachten Sie jedoch, dass dies und andere Socket-Aufrufe normalerweise blockieren. Daher haben Sie an dieser Stelle einige Möglichkeiten:

  • Öffnen Sie neue Threads, um mit Clients umzugehen, während der Haupt-Thread neue Clients akzeptiert
  • Wie oben, jedoch mit Prozessen anstelle von Threads
  • Verwenden Sie asynchrone Socket-Frameworks wie Twisted oder eine Vielzahl anderer
13
Eli Bendersky

Hier ist das Beispiel aus der SocketServer-Dokumentation das wäre ein hervorragender Ausgangspunkt

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __== "__main__":
    Host, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((Host, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

Versuchen Sie es an einem Terminal wie diesem

$ telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello
HELLOConnection closed by foreign Host.
$ telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Sausage
SAUSAGEConnection closed by foreign Host.

Sie müssen wahrscheinlich auch A Forking oder Threading Mixin verwenden

5
Nick Craig-Wood

Mit diesem Programm werden 26 Sockets geöffnet, mit denen Sie viele TCP -Clients verbinden können.

#!usr/bin/python
from thread import *
import socket
import sys

def clientthread(conn):
    buffer=""
    while True:
        data = conn.recv(8192)
        buffer+=data
        print buffer
    #conn.sendall(reply)
    conn.close()

def main():
    try:
        Host = '192.168.1.3'
        port = 6666
        tot_socket = 26
        list_sock = []
        for i in range(tot_socket):
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
            s.bind((Host, port+i))
            s.listen(10)
            list_sock.append(s)
            print "[*] Server listening on %s %d" %(Host, (port+i))

        while 1:
            for j in range(len(list_sock)):
                conn, addr = list_sock[j].accept()
                print '[*] Connected with ' + addr[0] + ':' + str(addr[1])
                start_new_thread(clientthread ,(conn,))
        s.close()

    except KeyboardInterrupt as msg:
        sys.exit(0)


if __== "__main__":
    main()
1
Rajkumar Pandi
#!/usr/bin/python
import sys
import os
import soskcet
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         
Host = socket.gethostname() 
port = 50000

try:
    s.bind((Host, port))
except socket.error as msg:
    print(str(msg))
s.listen(10)
conn, addr = s.accept()  
print 'Got connection from'+addr[0]+':'+str(addr[1]))
while 1:
        msg = s.recv(1024)
        print +addr[0]+, ' >> ', msg
        msg = raw_input('SERVER >>'),Host
        s.send(msg)
s.close()
0
Skiller Dz