2010-02-10 4 views
-4

J'essaie d'apprendre et d'écrire cette partie du code.C# http réponse

tout en testant quelques semaines avant qu'il a couru la façon dont je voulais, cela ne fonctionne pas son code de msdn et la partie de la réponse http a été suggérée par Feroz Using HttpWebRequest to send HTML to a Browser

maintenant après un certain temps il ne fonctionne pas ..

je comptais obtenir bonjour il y a un message que dans le code qui pourrait être à l'aide (StreamWriter sw = new StreamWriter(stream)) { sw.Write("<html><body>Hello There!</body></html>"); } mais il ne montre que GET \

 try 
    { 

     // Set the TcpListener on port 13000. 
      Int32 port = 80; 
      IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 

      // TcpListener server = new TcpListener(port); 
      TcpListener server = new TcpListener(localAddr, port); 

      // Start listening for client requests. 
      server.Start(); 

      // Buffer for reading data 
      Byte[] bytes = new Byte[256]; 
      String data = null; 

      // Enter the listening loop. 
      while (true) 
      { 
       Console.Write("Waiting for a connection... "); 

       // Perform a blocking call to accept requests. 
       // You could also user server.AcceptSocket() here. 
       TcpClient client = server.AcceptTcpClient(); 
       Console.WriteLine("Connected!"); 

       data = null; 

       // Get a stream object for reading and writing 
       NetworkStream stream = client.GetStream(); 

       int i; 

       // Loop to receive all the data sent by the client. 
       while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
       { 
        // Translate data bytes to a ASCII string. 
        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
        Console.WriteLine(String.Format("Received: {0}", data)); 

        // Process the data sent by the client. 
        data = data.ToUpper(); 

        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); 

        // Send back a response. 
        stream.Write(msg, 0, msg.Length); 
        Console.WriteLine("Sending message.."); 


    using(StreamWriter sw = new StreamWriter(stream)) 
    { 
     sw.Write("<html><body>Hello There!</body></html>"); 
    } 

       } 

       // Shutdown and end connection 
       client.Close(); 
      } 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 

     Console.WriteLine("\nHit enter to continue..."); 
     Console.Read(); 
    } 
} 
+9

Comment ça "ne fonctionne pas"? Que ce passe-t-il ? Des exceptions? Quel type de client utilisez-vous pour vous connecter à ce serveur? – nos

+0

Pourquoi ça ne marche pas? Ce qui se produit? As-tu un pare-feu? – SLaks

+0

Quelle est l'erreur que vous obtenez? –

Répondre

1

le code présenté dans la question sera thro w ObjectDisposedException après la première lecture du réseau. Qu'est-ce que vous faites "mal" dispose le StreamWriter (implicite dans l'instruction en utilisant), qui dispose le flux réseau sous-jacent. Une fois disposé, vous ne pouvez plus revenir en arrière et en lire plus. De plus, vous mélangez l'écriture directement au flux et l'écriture à travers le StreamWriter (tamponné).

La question devrait être reformulé à quelque chose comme:

**

Pourquoi ce code lecture/données d'écriture d'un client une fois, puis lancer une exception sur la deuxième lecture tentative?

**

Je restructurer le code comme indiqué ci-dessous. [Note: L'appel Flush() n'est pas vraiment nécessaire, mais vous le voulez probablement pour cette démo.]

try 
{ 
    // Listen for connections on port 13000 
    TcpListener server = new TcpListener(IPAddress.Loopback, 13000); 
    server.Start(); 

    // Read up tp 256 bytes at a time 
    Byte[] bytes = new Byte[256]; 
    String data; 

    // Enter the listening loop. 
    while (true) 
    { 
     Console.WriteLine("Waiting for a connection... "); 

     // Wait for a client connection 
     TcpClient client = server.AcceptTcpClient(); 
     Console.WriteLine("Connected!"); 

     // Setup I/O streams 
     NetworkStream stream = client.GetStream(); 
     using (StreamWriter sw = new StreamWriter(stream)) 
     { 
      int i; 

      // Loop to receive all the data sent by the client. 
      while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
      { 
       // Translate data bytes to a ASCII string. 
       data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
       Console.WriteLine(String.Format("Received: {0}", data)); 

       // Process the data sent by the client. 
       data = data.ToUpper(); 

       // Send back a response. 
       Console.WriteLine("Sending message.."); 
       sw.Write(data); 

       // Add a little extra 'response' 
       sw.Write("<html><body>Hello There!</body></html>"); 
       sw.Flush(); 
      } 
     } 
     // Close connection 
     client.Close(); 
    } 
} 
catch (SocketException e) 
{ 
    Console.WriteLine("SocketException: {0}", e); 
} 
+0

merci pour votre soutien .... mais le problème est toujours mon navigateur ne pouvait pas afficher le message "Hello There" retour. .. peut être bcoz il n'y a pas de réponse en-tête http mais aucune idée de comment cela peut être fait .... pour résumer je voulais que mon navigateur affiche les balises html .. – tike

+1

Si vous voulez que votre navigateur affiche un message, alors vous avoir à utiliser le protocole HTTP pour les communications, pas seulement renvoyer du HTML. Voir la documentation sur le protocole HTTP sur le web; il n'est pas difficile d'écrire un serveur web, rechercher sur Internet comment accomplir. – Bill