2010-07-09 50 views
0

我必須在代碼中丟失一些東西。我已經重寫了一個'echo server'的例子,當它收到一些東西時做更多的事情。python中的套接字將只發送它收到的數據

這是它目前的樣子:


#!/usr/bin/env python 

import select 
import socket 
import sys 
import threading 
import time 
import Queue 

globuser = {} 
queue = Queue.Queue() 

class Server: 
    def __init__(self): 
     self.host = '' 
     self.port = 2000 
     self.backlog = 5 
     self.size = 1024 
     self.server = None 
     self.threads = [] 

    def open_socket(self): 
     try: 
      self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      self.server.bind((self.host,self.port)) 
      self.server.listen(5) 
     except socket.error, (value,message): 
      if self.server: 
       self.server.close() 
      print "Could not open socket: " + message 
      sys.exit(1) 

    def run(self): 
     self.open_socket() 
     input = [self.server,sys.stdin] 
     running = 1 
     while running: 
      inputready,outputready,exceptready = select.select(input,[],[]) 

      for s in inputready: 

       if s == self.server: 
        # handle the server socket 
        c = Client(self.server.accept(), queue) 
        c.start() 
        self.threads.append(c) 

       elif s == sys.stdin: 
        # handle standard input 
        junk = sys.stdin.readline() 
        running = 0 

     # close all threads 

     self.server.close() 
     for c in self.threads: 
      c.join() 

class Client(threading.Thread): 
    initialized=0 

    def __init__(self,(client,address), queue): 
     threading.Thread.__init__(self) 
     self.client = client 
     self.address = address 
     self.size = 1024 
    self.queue = queue 
    self.threads = [] 
     global globuser 
     print 'Client thread created!' 


    def run(self): 
     running = 1 
     while running: 
      print 'While running client' 
      data = self.client.recv(self.size) 
      print 'Dit we receive data?' 
      if data: 
       print 'Data received!' 
     print 'Fetching data from socket: ', 
     if data[0] == 'I': 
      print 'Initializing user: ' + data 
      user = {'uid': data[1:6] ,'x': data[6:9], 'y': data[9:12]} 
      globuser[user['uid']] = user 
      print globuser 
      initialized=1 
      m=updateClient(user['uid'], queue) 
      m.start() 
      self.threads.append(m) 
      self.client.send('Beginning - Initialized'+';') 

     elif data[0] == 'A': 
      print 'Client has received previous data: ' + data 

     #On deactivation, nothing works. 
       self.client.send(data+';') 
       #print 'Client Data sent: ' + data 
      else: 
       print 'Closing' 
       self.client.close() 
       running = 0 

    if self.queue.empty(): 
     print 'Queue is empty' 
    else: 
     print 'Queue has information: ', 
     data2 = self.queue.get(1, 1) 
     isdata2 = 1 
     if data2 == 'Exit': 
      running = 0 
      print 'Client is being closed' 
      self.client.close() 

    if isdata2 == 1: 
     print 'Sending data to client: ' + data2, 
     self.client.send(data2) 
     self.queue.task_done() 
     isdata2 = 0 

    time.sleep(1) 

class updateClient(threading.Thread): 

    def __init__(self,uid, queue): 
     threading.Thread.__init__(self) 
     self.uid = uid 
     self.queue = queue 
     global globuser 
     print 'updateClient thread started!' 

    def run(self): 
     running = 20 
     test=0 
     while running > 0: 
      test = test + 1 
      self.queue.put('Test Queue Data #' + str(test)) 
      running = running - 1 
      time.sleep(1) 

     print 'Updateclient has stopped' 



if __name__ == "__main__": 
    s = Server() 
    s.run() 

這運行正常,雖然它是一種愚蠢到繼續發送相同的數據再次與其他數據一起。

在代碼的中間,你會看到


     #On deactivation, nothing works. 
       self.client.send(data+';') 
       #print 'Client Data sent: ' + data 

當我取消激活了self.client.send(data+';'),或者變成self.client.send('something else;')這是行不通的!客戶端收不到任何東西。

「data」變量有什麼特別之處嗎?我需要以某種方式格式化字符串嗎?

回答

2

這是一個清理完好的代碼功能版本!我自己測試過,儘管我沒有編寫單元測試。

原始代碼有一些語法錯誤和其他各種問題,所以我採取了一些自由。我假設該協議 使用;作爲分隔符陷害,因爲;在每個 信息給客戶端的端發出,但沒有幀在原始代碼正在做。

from twisted.internet import reactor, protocol, task 
from twisted.protocols import basic 
from twisted.python import log 
import sys 

class ServerProtocol(basic.LineOnlyReceiver): 
    delimiter = ';' 

    def lineReceived(self, line): 
     if line.startswith('I'): 
      user = dict(uid=line[1:6], x=line[6:9], y=line[9:12]) 
      self.factory.users[user['uid']] = user 
      log.msg(repr(self.factory.users)) 
      self.startUpdateClient() 
      self.sendLine('Beginning - Initialized') 
     elif line.startswith('A'): 
      self.sendLine(line) 
     else: 
      self.transport.loseConnection() 

    def _updateClient(self): 
     if self._running == 0: 
      self._looper.stop() 
      return 
     self._running -= 1 
     self._test += 1 
     self.sendLine('Test Queue Data #%d' % (self._test,)) 

    def startUpdateClient(self): 
     self._running, self._test = 20, 0 
     self._looper = task.LoopingCall(self._updateClient) 
     self._looper.start(1, now=False) 

class Server(protocol.ServerFactory): 
    protocol = ServerProtocol 
    def __init__(self): 
     self.users = {} 

if __name__ == '__main__': 
    log.startLogging(sys.stderr) 
    reactor.listenTCP(2000, Server()) 
    reactor.run() 
相關問題