2011-03-09 9 views
5

Może to być bułka z masłem dla każdego doświadczonym deweloperem C#C# asynchroniczny Serwer - jak wysyłać dane do klienta

Co widzisz oto próbka asynchroniczny WEBSERVER

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

Pobrałem to z w Internecie, aby mieć podstawowy model do pracy.

Zasadniczo potrzebuję uruchomić ten serwer sieciowy jako proces na komputerze. Będzie cały czas słuchać por 8080, a kiedy komputer kliencki wyśle ​​żądanie, serwer ten przetworzy pewne dane i wyśle ​​wynik jako ciąg.

stworzyłem mały projekt z tego kodu (co jest funkcjonalne, jak jest), ale gdy uruchamia linię

client.Send(message); 

wszystko otrzymuję błąd w przeglądarce, lub co najwyżej pusta strona

podejrzewam muszę zdefiniować nagłówki HTTP do wysyłania wiadomości (z), ale zostały poszukiwania w internecie na ten temat bez powodzenia

Każdy chętny do pomocy?

Dzięki!

Odpowiedz

4

Trzeba coś takiego

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] 

Jeśli wysyłasz ten blok dołkowe danych powinno działać poprawnie.

Edit:

Można użyć tej metody:

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

I w Main() - metoda należy wymienić

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

z

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

a następnie włóż

// 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); 

przed

client.Send(message); 

To wszystko.

+0

Dzięki za napiwek! Trochę googlowałem, ale nie mogę znaleźć sposobu na wygenerowanie nagłówków HTTP ... czy mógłbyś podać mi link lub przykład oparty na wklejonym przeze mnie kodzie? Jeszcze raz dziękuję! – jprealini

+0

Praca nad nim. Zabawny fakt: skopiowałem twój kod, skompilowałem go i działa :-D – Tokk

+0

Wow, świetnie! Kolejny śmieszny fakt: Miałem metodę podobną do tej w innym projekcie testowym, nad którym pracowałem i udało mi się to zrobić prawie dokładnie tak, jak to opisałeś, i działało PERFECTLY ... Milion dzięki ... Myślę, że nadal nie można przypisać punktu lub podobnych rzeczy, ale powinieneś wiedzieć, że byłbym szczęśliwy mogąc dać ci trochę, gdybym mógł ... Dzięki! – jprealini

Powiązane problemy