2017-09-03 9 views
1

server.pykeine Daten

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 enthält eine Variable der Kopfdaten zu senden

I bereitgestellt, um die ganze gesendet werden Server, damit Sie mein Problem ausführen und verstehen können. Nachdem die Authentifizierung gesendet wird, wenn sie korrekt ist, sendet der Server ok, aber das Problem ist self.transport.write("ok") wird nicht vom Client gesehen. Ich habe versucht zu googeln, aber ich habe keine Korrekturen.

Antwort

0

So mehrere Probleme mit Ihrem Ansatz. Zuerst von euch alle erbt den Ansatz von einem Echo-Server und den Weg nach draußen. Und wie es aussieht, brauchen Sie einen HTTP Server. So sehen Sie unten zum Beispiel von Anfrage- und Antwort

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

Auch wenn Sie Probleme mit Ihrem Code verstehen müssen. Dann ist es hauptsächlich Ihre DatenReceived.

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'] 

Sie gehen davon aus data Körper haben. Obwohl das nicht stimmt, wird es auch die Header haben. So wird Ihr Anruf fehlschlagen. Eine einfache Abhilfe Sie hinzufügen können, ist unter

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

Weite Schlüsselprüfung sollte wie diese

if "PyCasterAuth" in dct: 

getan werden, da es keine Methode has_key ist. Auch am Ende des DataReceived wollen Sie die Anfrage schließen, damit es nicht auf sich halten

self.transport.loseConnection() 

So aktualisiert Funktion wartet, wie unten

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

Aber wie ich bereits erwähnt, sollten Sie nicht verwenden Dieser Ansatz ist eher einer von dem Link, den ich hinzugefügt habe.

Unten ist ein einfacher Test

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%