2011-02-05 99 views
3

好吧,我花了大約三個小時來擺弄Python編程中的套接字編程,試圖製作一個簡單的聊天程序。我已經讓客戶端向服務器發送文本,然後從客戶端開始,它將信息重複給自己。但是,我希望將消息發送到服務器,然後服務器(而不是客戶端)將它重新發送到所有客戶端的連接。我遇到問題。這是到目前爲止我的代碼:Socket編程問題 - 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() 

客戶端代碼:

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

現在你的應用實例爲每個客戶端連接MyUDPHandler類。當連接打開時,您需要將該實例存儲到靜態數組或隊列中。然後,當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

有沒有關於這樣做的教程?如果沒有,請你舉個例子嗎? – 2011-02-05 01:55:30

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