2011-03-09 22 views
5

Esto podría ser un juego de niños para cualquier experimentado desarrollador de C#C# asíncrono servidor web - cómo enviar datos al cliente

Lo que se ve aquí es un servidor web asincrónico muestra

using System; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace SimpleServer 
{ 
    class Program 
    { 
     public static void ReceiveCallback(IAsyncResult AsyncCall) 
     {    
      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      Byte[] message = encoding.GetBytes("I am a little busy, come back later!");    
      Socket listener = (Socket)AsyncCall.AsyncState; 
      Socket client = listener.EndAccept(AsyncCall); 
      Console.WriteLine("Received Connection from {0}", client.RemoteEndPoint); 
      client.Send(message); 
      Console.WriteLine("Ending the connection"); 
      client.Close(); 
      listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener); 
     } 

    public static void Main() 
    { 
     try 
     { 
      IPAddress localAddress = IPAddress.Parse("127.0.0.1"); 
      Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 8080); 
      listenSocket.Bind(ipEndpoint); 
      listenSocket.Listen(1); 
      listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket); 
      while (true) 
      {      
       Console.WriteLine("Busy Waiting...."); 
       Thread.Sleep(2000); 
      }     
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Caught Exception: {0}", e.ToString()); 
     } 
    } 
} 

he descargado esto desde el web, para tener un modelo básico para trabajar.

Básicamente lo que tengo que hacer es ejecutar este servidor web como un proceso en una computadora. Escuchará por 8080 todo el tiempo, y cuando una computadora cliente envíe una solicitud, este servidor procesará algunos datos y enviará un resultado como una cadena.

he creado un pequeño proyecto con el código (que es funcional como lo es), pero cuando se ejecuta la línea de

client.Send(message); 

único que consigue es un error en el navegador, o como máximo una página en blanco

sospecho que necesito para definir las cabeceras HTTP para enviar con el (mensaje), pero he estado buscando en la web en este sin suerte

Cualquier persona dispuesta a ayudar?

Gracias!

Respuesta

4

se necesita algo como esto

HTTP/1.1 200 OK 
Server: My Little Server 
Content-Length: [Size of the Message here] 
Content-Language: en 
Content-Type: text/html 
Connection: close 

[Message] 

Si envía este bloque orificio de datos que debería funcionar correctamente.

Editar:

Puede utilizar este método:

public static void SendHeader(string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) 
    { 
     String sBuffer = ""; 
     // if Mime type is not provided set default to text/html 
     if (sMIMEHeader.Length == 0) 
     { 
      sMIMEHeader = "text/html"; // Default Mime Type is text/html 
     } 
     sBuffer = sBuffer + "HTTP/1.1" + sStatusCode + "\r\n"; 
     sBuffer = sBuffer + "Server: cx1193719-b\r\n"; 
     sBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "\r\n"; 
     sBuffer = sBuffer + "Accept-Ranges: bytes\r\n"; 
     sBuffer = sBuffer + "Content-Length: " + iTotBytes + "\r\n\r\n"; 
     Byte[] bSendData = Encoding.ASCII.GetBytes(sBuffer); 
     mySocket.Send(Encoding.ASCII.GetBytes(sBuffer),Encoding.ASCII.GetBytes(sBuffer).Length, 0); 
     Console.WriteLine("Total Bytes : " + iTotBytes.ToString()); 
    } 

Y en su principal() - Método Debe reemplazar

Byte[] message = encoding.GetBytes("I am a little busy, come back later!"); 

con

string messageString = "I am a little busy, come back later!"; 
Byte[] message = encoding.GetBytes(messageString); 

y luego insertar

// Unicode char may have size more than 1 byte so we should use message.Length instead of messageString.Length 
SendHeader("text/html", message.Length, "202 OK", ref client); 

antes

client.Send(message); 

eso es todo.

+0

¡Gracias por la sugerencia! He estado buscando en Google un poco, pero no puedo encontrar una forma de generar los encabezados HTTP ... ¿podría darme un enlace o un ejemplo basado en el código que pegué? ¡Gracias de nuevo! – jprealini

+0

trabajando en ello. Dato curioso: copié tu código, lo compilé y funciona :-D – Tokk

+0

¡Guau, genial! Otro hecho curioso: tenía un método similar a este en otro proyecto de prueba en el que estaba trabajando, y logré hacer esto casi exactamente como lo describe aquí, y funcionó PERFECTAMENTE ... Un millón de gracias ... Creo que Todavía no puedo asignar un punto o cosas así, pero debes saber que me gustaría darte un poco si pudiera ... ¡Gracias! – jprealini

Cuestiones relacionadas