2010-07-09 51 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() 
相关问题