2017-10-18 3 views
0

Je travaille sur un petit projet en C# où j'ai besoin de créer un client socket et de regarder le socket pour un fichier json.WebSocketSharp essayant d'ouvrir le socket et de lire les données entrantes

J'ai essayé quelques chose et chaque fois que je lance le projet, j'obtiens l'erreur:

PM|Fatal|StackBuilderSink._PrivateProcessMessage|WebSocketSharp.WebSocketExceptio n: An exception has occurred while reading an HTTP request/response. ---> System.IO.EndOfStreamException: The header cannot be read from the data source.

Certains arrière-plan. Pour tester, j'utilise node.js avec socket.io pour lire un fichier Json et io.emit les données. Je sais que les données sont correctement formatées J'ai une page de script HTML/Java qui voit les données et fait des choses avec.

public MainWindow() 
{ 
    InitializeComponent(); 

    using (var ws = new WebSocket("ws://127.0.0.1:8889")) 
    { 
     ws.OnMessage += (sender, e) => 
       json_output.Text = (e.Data); 

     ws.ConnectAsync(); 
    } 
} 
+0

Je crois que le problème que je puisse avoir est que mon serveur de test et le serveur en question ne fonctionneront pas. existe-t-il un moyen de contourner la poignée de main et juste d'écouter le fil de socket? – Jyeomans

Répondre

0

D'après votre description, je suppose que vous envoyez le fichier JSON-plaine par io.emit.

Le protocole de transport hypertexte (HTTP) prévoit que le respone construit comme décrit dans wikipedia (HTTP response):

The response message consists of the following:

  • A status line which includes the status code and reason message (e.g., HTTP/1.1 200 OK, which indicates that the client's request
    succeeded).
  • Response header fields (e.g., Content-Type: text/html).
  • An empty line.
  • An optional message body.

Par conséquent, vous devez envoyer les informations de ligne d'état et en-tête de réponse en premier, suivi par une ligne vide. Après cela, vous pouvez envoyer le contenu du fichier json en tant que corps du message. Je suppose qu'il existe également une bibliothèque pour node.js qui fonctionnera comme un serveur web et gérera les choses HTTP.


Si vous voulez gérer un flux de données simple sans un protocole, vous ne devriez pas utiliser une prise spécifique de protocole comme WebSocket mais un générique comme TcpListener.

Bien sûr, vous avez alors de résoudre les problèmes qui doivent être résolus par un protocole comme quand est la fin d'un message/fichier ...

Des exemples de l'utilisation TcpListener et pitholes pour éviter devraient être disponibles ici sur stackoverflow ou via Dr. Google.

+0

donc le problème que je n'ai pas est que le serveur qui fournit le fichier json dans le test en direct vient d'un serveur je ne peux pas changer. Je viens de construire mon serveur de test pour correspondre. est-il un moyen de simplement regarder le serveur pour les données et ne pas exiger la formalité? Fondamentalement, je travaille avec un système de signalisation numérique sur un réseau fermé. J'essaie juste d'interrompre le flux de données avec mon système et j'ai donné à l'utilisateur un certain contrôle dans le flux de données. – Jyeomans

+0

@Jeedomains: réponse élargie en réponse à votre commentaire –