2017-09-03 80 views
1

server.py扭曲不发送数据

from twisted.python import log 
from twisted.internet import reactor,ssl, protocol 
import config 
import uuid 
import json 
import header 

class cl: 
    clients = list() 
    source = None 
    sourceID = None 
    sent_header = list() 
    id3_headers = { 
     "pyc-title": "None", 
     "pyc-length": "0", 
    } 

class RadioServer(protocol.Protocol): 

    def connectionMade(self): 
     if config.PyCasterMaxListeners != len(cl.clients): 
      self.id = str(uuid.uuid4()) 
      self.peer = str(self.transport.getPeer()) 
      self.transport.write(header.header) 
      cl.clients.append(self) 
      print("Client-Connected-IP: "+self.peer) 
      print("Client-Connected-ID: " + self.id) 
     else: 
      self.transport.abortConnection() 

    def connectionLost(self, reason): 
     if self.id == cl.sourceID: 
      print("Source-Closed: "+ str(reason)) 
      cl.sourceID = None 
      cl.source = None 
     else: 
      self.removeClient(self.id) 
      print("Client-Closed-Reason: " + reason) 
      print("Client-Closed-IP: " + self.peer) 
      print("Client-Closed-ID: " + self.id) 

    def dataReceived(self, data): 
     dct = json.loads(data, encoding="utf8") 
     if dct.has_key("PyCasterAuth"): 
      if not cl.sourceID: 
       auth = dct['PyCasterAuth'] 
       if auth == config.PyCasterAuth: 
        cl.source = self 
        cl.sourceID = self.id 
        self.transport.write("ok") 
        print("Source-Registered") 
        print("Source-ID: " + self.id) 
       else: 
        cl.source.transport.write("denied") 
        print("Source-Login-Denied-IP: " + self.peer) 
        print("Source-Login-Denied-ID: " + self.id) 
      else: 
       print("Source-Exists-IP: " + self.peer) 
       print("Source-Exists-ID: " + self.id) 
       self.closeCl(self.id) 
     elif dct.has_key("buffer"): 
      buffer = dct['buffer'] 
      self.sendClients(buffer, bin=True) 

     elif dct.has_key("info"): 
      cl.id3_headers = dct['info'] 

    def removeClient(self, id): 
     for client in cl.clients: 
      if client.id == id: 
       cl.clients.remove(cl) 
       if client in cl.sent_header: 
        cl.sent_header.remove(client) 

    def closeCl(self, id): 
     for client in cl.clients: 
      if client.id == id: 
       self.removeClient(id) 
       client.transport.abortConnection() 
       print("Server-Closed-Client: (%s, %s)" % (id, client.peer)) 

    def sendClients(self, msg, bin=False): 
     for client in cl.clients: 
      if bin: 
       if client not in cl.sent_header: 
        head = header.header 
        for k, v in iter(cl.id3_headers.items()): 
         head += k + ":" + v 
        client.transport.write("HTTP/1.1 200 OK\r\n") 
        client.transport.write(head) 
      client.transport.write(msg) 
      if config.PyCasterSendLogging: 
       print("SENT %i bytes TO %s" % (len(msg), client.id)) 


if __name__=="__main__": 
    import sys 
    key = config.PyCasterSSLKey 
    cert = config.PyCasterSSLCert 
    factory = protocol.Factory() 
    log.startLogging(sys.stdout) 
    factory.protocol = RadioServer 
    if config.PyCasterSSL: 
     reactor.listenSSL(config.PyCasterPort, factory, ssl.DefaultOpenSSLContextFactory(key, cert)) 
     reactor.run() 
    else: 
     reactor.listenTCP(config.PyCasterPort, factory) 
     reactor.run() 

config.py

PyCasterAuth = "123abc" 
PyCasterPort = 4446 
PyCasterSSL = False 
PyCasterSSLKey = None 
PyCasterSSLCert = None 
PyCasterMaxListeners = 32 
PyCasterSendLogging = True 
PyCasterLogFile=open("pycaster.log", "w") #can be sys.stdout 

header.py包含标题数据的可变要发送

我提供整个服务器,以便您可以运行并了解我的问题。在auth发送后,如果其正确的服务器发送ok但问题是self.transport.write("ok")不会被客户端看到。我尝试了谷歌搜索,但没有修复。

回答

0

因此,您的方法存在多个问题。首先你们从一个回显服务器继承了这个方法,然后让出你的出路。从外观上看,你似乎需要一个HTTP服务器。所以,看看下面例如请求和响应

http://twistedmatrix.com/documents/current/web/howto/web-in-60/dynamic-content.html

此外,如果你需要了解你的代码的问题。那么它主要是你的dataReceived。

def dataReceived(self, data): 
    dct = json.loads(data, encoding="utf8") 
    if dct.has_key("PyCasterAuth"): 
     if not cl.sourceID: 
      auth = dct['PyCasterAuth'] 
      if auth == config.PyCasterAuth: 
       cl.source = self 
       cl.sourceID = self.id 
       self.transport.write("ok") 
       print("Source-Registered") 
       print("Source-ID: " + self.id) 
      else: 
       cl.source.transport.write("denied") 
       print("Source-Login-Denied-IP: " + self.peer) 
       print("Source-Login-Denied-ID: " + self.id) 
     else: 
      print("Source-Exists-IP: " + self.peer) 
      print("Source-Exists-ID: " + self.id) 
      self.closeCl(self.id) 
    elif dct.has_key("buffer"): 
     buffer = dct['buffer'] 
     self.sendClients(buffer, bin=True) 

    elif dct.has_key("info"): 
     cl.id3_headers = dct['info'] 

你假设data将有正文。虽然这不是事实,它也会有标题。所以你的电话会失败。简单的解决方法,你可以添加低于

data_body = data.split(b"\r\n\r\n")[1] 
    dct = json.loads(data_body, encoding="utf8") 

下一页键检查应该这样

if "PyCasterAuth" in dct: 

来完成,因为没有方法has_key。同样在dataReceived结束时,您要关闭的请求,所以它不会一直等下去

self.transport.loseConnection() 

所以更新的功能如下

def dataReceived(self, data): 
    data_body = data.split(b"\r\n\r\n")[1] 
    dct = json.loads(data_body, encoding="utf8") 
    if "PyCasterAuth" in dct: 
     if not cl.sourceID: 
      auth = dct['PyCasterAuth'] 
      if auth == config.PyCasterAuth: 
       cl.source = self 
       cl.sourceID = self.id 
       self.transport.write(b"ok") 
       print("Source-Registered") 
       print("Source-ID: " + self.id) 
      else: 
       cl.source.transport.write("denied") 
       print("Source-Login-Denied-IP: " + self.peer) 
       print("Source-Login-Denied-ID: " + self.id) 
     else: 
      print("Source-Exists-IP: " + self.peer) 
      print("Source-Exists-ID: " + self.id) 
      self.closeCl(self.id) 
    elif dct.has_key("buffer"): 
     buffer = dct['buffer'] 
     self.sendClients(buffer, bin=True) 

    elif dct.has_key("info"): 
     cl.id3_headers = dct['info'] 

    self.transport.loseConnection() 

但正如我提到的,你不应该使用这种方法更多的来自我添加的链接。

下面是一个简单的测试

curl -v -H "Content-Type: application/json" -X POST -d '{"PyCasterAuth":"123abc"}' localhost:4446 
Note: Unnecessary use of -X or --request, POST is already inferred. 
* Rebuilt URL to: localhost:4446/ 
* Trying ::1... 
* TCP_NODELAY set 
* Connection failed 
* connect to ::1 port 4446 failed: Connection refused 
* Trying 127.0.0.1... 
* TCP_NODELAY set 
* Connected to localhost (127.0.0.1) port 4446 (#0) 
> POST/HTTP/1.1 
> Host: localhost:4446 
> User-Agent: curl/7.54.0 
> Accept: */* 
> Content-Type: application/json 
> Content-Length: 25 
> 
* upload completely sent off: 25 out of 25 bytes 
Name: Tarun 
* Connection #0 to host localhost left intact 
ok%