そのため、オンラインゲームの複数のクライアントを処理するためにソケットを必要とするiPhoneアプリを開発しています。私はTwistedを試しましたが、多くの努力を払って、一度に大量の情報を送信することができませんでした。そのため、ソケットを試行します。
私の質問は、以下のコードを使用して、複数のクライアントをどのように接続できるようにするかです。リストを試しましたが、そのためのフォーマットがわかりません。複数のクライアントが同時に接続され、特定のクライアントにメッセージを送信できる場合、これをどのように達成できますか?
ありがとうございました!
#!/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
あなたの質問に基づいて:
私の質問は、以下のコードを使用して、複数のクライアントをどのように接続できるようにするかです。リストを試しましたが、そのためのフォーマットがわかりません。複数のクライアントが同時に接続され、特定のクライアントにメッセージを送信できる場合、これをどのように達成できますか?
指定したコードを使用して、これを行うことができます。
#!/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()
Eli Benderskyが言及したように、スレッドの代わりにプロセスを使用できます。また、python threading
モジュールまたは他の非同期ソケットフレームワークをチェックすることもできます。あなたが望む、これは単なる基本的なフレームワークです。
accept
は、新しいクライアント接続を継続的に提供できます。ただし、通常、他のソケット呼び出しはブロックしていることに注意してください。したがって、この時点でいくつかのオプションがあります。
SocketServer documentation からの例は次のとおりです。これは優れた出発点になります
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 __name__ == "__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()
このような端末から試してみてください
$ 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.
おそらくAを使用する必要があります Forking or Threading Mixin too
このプログラムは26個のソケットを開き、そこに多くの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 __name__ == "__main__":
main()
#!/usr/bin/python
import sys
import os
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 50000
try:
s.bind((socket.gethostname() , 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()