2011-02-05 20 views
3

申し訳ありませんが、私は単純なチャットプログラムを作るためにPythonでソケットプログラミングを手伝っていました。私はクライアントにサーバーにテキストを送信させてから、クライアントからメッセージを繰り返します。しかし、私は、メッセージをサーバーに送信し、クライアントではなくサーバーに接続して、すべてのクライアントに接続し直してください。私はこれを行う問題があります。これは、これまでの私のコードです:ソケットプログラミングの問題 - Python

サーバーサイドコード:

import SocketServer 

    def handle(self): 
     data = self.request[0].strip() 
     socket = self.request[1] 
     print "%s wrote:" % self.client_address[0] 
     print data 
     socket.sendto(data.upper(), self.client_address) 


if __name__ == "__main__": 
    HOST, PORT = "localhost", 25555 
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler) 
    server.serve_forever() 

クライアント側コード:今、あなたのアプリが各クライアント接続用MyUDPHandlerクラスをインスタンス化され

import socket 
import sys 
global HOST 
global PORT 
HOST, PORT = "localhost", 25555 
while 1 > 0: 
    data = raw_input(">".join(sys.argv[1:])) 

# SOCK_DGRAM is the socket type to use for UDP sockets 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

# As you can see, there is no connect() call; UDP has no connections. 
# Instead, data is directly sent to the recipient via sendto(). 
    sock.sendto(data + "\n", (HOST, PORT)) 
    received = sock.recv(1024) 

    print "Sent:  %s" % data 
print "Received: %s" % received 

答えて

1

。接続が開かれたら、そのインスタンスを静的な配列またはキューに格納する必要があります。 handle()が呼び出されると、すべてのソケットをループして、それぞれのデータのコピーを送信することができます。

私はpythonのドキュメントをチェックアウトしたいと思います。それは基本的にあなたがお探しに何を行いますhttp://docs.python.org/library/socketserver.html#asynchronous-mixins

そして、私はその一例(だけでこれを落とさないでください、それはおそらく、明白なバグがあります!)から変更したい:

 
handlerList = [] 

class ... 

    def handle(self): 
     handlerList.append(self) 
     while (1): 
      data = self.request.recv(1024) 
      if (not data): 
      break 
      cur_thread = threading.currentThread() 
      response = "%s: %s" % (cur_thread.getName(), data) 
      for x in handlerList: 
      x.request.send(response) 
     psudo_code_remove_self_from_handlerList() 
+0

これについてのチュートリアルはありますか?そうでない場合は、例を挙げてください。 –

+0

各回線に新しいUDP接続を開くつもりはありますか?今は毎回新しいソケットを再交渉するようです。 – whitey04

+0

問題が解決しますか?もしそうなら、はいよりも。 –

1

あなたがしたいですすべてのソケットにパケットをエコーするが、データの元のソースはサーバーで再生しますか?

import socket, select 

def main(): 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind(('', 8989)) 
    server.listen(5) 
    sockets = [server] 
    while True: 
     for sender in select.select(sockets, [], [])[0]: 
      if sender is server: 
       sockets.append(server.accept()[0]) 
      else: 
       try: 
        message = sender.recv(4096) 
       except socket.error: 
        message = None 
       if message: 
        for receiver in sockets: 
         if receiver not in (server, sender): 
          receiver.sendall(message) 
       else: 
        sender.shutdown(socket.SHUT_RDWR) 
        sender.close() 
        sockets.remove(sender) 

if __name__ == '__main__': 
    main() 
関連する問題