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