web-dev-qa-db-fra.com

Socket Python Clients multiples

Je travaille donc sur une application iPhone qui nécessite un socket pour gérer plusieurs clients pour les jeux en ligne. J'ai essayé Twisted, et avec beaucoup d'efforts, je n'ai pas réussi à envoyer un tas d'informations à la fois, c'est pourquoi je vais maintenant essayer de faire une socket.

Ma question est, en utilisant le code ci-dessous, comment pourriez-vous avoir plusieurs clients connectés? J'ai essayé des listes, mais je n'arrive pas à comprendre le format. Comment cela peut-il être réalisé lorsque plusieurs clients sont connectés en même temps et que je peux envoyer un message à un client spécifique?

Je vous remercie!

#!/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

Basé sur votre question:

Ma question est, en utilisant le code ci-dessous, comment pourriez-vous avoir plusieurs clients connectés? J'ai essayé des listes, mais je n'arrive pas à comprendre le format. Comment cela peut-il être réalisé lorsque plusieurs clients sont connectés en même temps et que je peux envoyer un message à un client spécifique?

En utilisant le code que vous avez donné, vous pouvez faire ceci: 

#!/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()

Comme Eli Bendersky l'a mentionné, vous pouvez utiliser des processus au lieu de threads, vous pouvez également vérifier le module python threading ou un autre framework de sockets async. Remarque: il vous reste des vérifications à mettre en œuvre comme vous le souhaitez et il ne s'agit que d'un cadre de base.

21
Julian Chukwu

accept peut fournir en permanence de nouvelles connexions client. Cependant, notez que cela, et d'autres appels de socket bloquent généralement. Par conséquent, vous avez quelques options à ce stade:

  • Ouvrir de nouveaux threads pour gérer les clients, tandis que le thread principal revient à accepter de nouveaux clients
  • Comme ci-dessus mais avec des processus, au lieu de threads
  • Utilisez des infrastructures de socket asynchrones comme Twisted ou une pléthore d’autres
13
Eli Bendersky

Voici l'exemple de la documentation SocketServer qui constituerait un excellent point de départ

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()

Essayez-le depuis un terminal comme celui-ci

$ 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.

Vous aurez probablement besoin d'utiliser A Mixin Forking ou Threading

5
Nick Craig-Wood

Ce programme ouvrira 26 sockets sur lesquels vous pourrez connecter beaucoup de clients TCP.

#!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