2017-09-03 3 views
1

de server.pydonnées torsadées ne pas envoyer

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 contient une variable de données d'en-tête doivent être envoyés

I fourni l'ensemble serveur afin que vous puissiez exécuter et comprendre mon problème. Après l'envoi de l'authentification si le serveur envoie correctement ok, le problème est self.transport.write("ok") n'est pas visible par le client. J'ai essayé de googler mais je n'ai pas de corrections.

Répondre

0

Donc, plusieurs problèmes avec votre approche. Tout d'abord, vous héritez de l'approche d'un serveur d'écho et vous vous en sortez. Et d'après les apparences, il semble que vous ayez besoin d'un serveur HTTP. Alors regardez ci-dessous par exemple de la demande et la réponse

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

Aussi, si vous avez besoin de comprendre les problèmes avec votre code. Ensuite, il s'agit principalement de vos données reçues.

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

Vous assumez data aura corps. Bien que ce ne soit pas vrai, il aura aussi les en-têtes. Donc, votre appel échouera. Une solution simple, vous pouvez ajouter est ci-dessous

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

vérification de la clé suivante doit être fait comme ce

if "PyCasterAuth" in dct: 

car il n'y a pas de méthode has_key. À la fin de la dataReceived vous voulez fermer la demande il ne tient pas à attendre

self.transport.loseConnection() 

fonction donc mise à jour est comme ci-dessous

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

Mais comme je l'ai mentionné, vous ne devriez pas utiliser cette approche plutôt un du lien que j'ai ajouté.

est Ci-dessous un test simple

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%