2011-03-09 53 views
5

veri göndermek için nasıl Bu Burada gördüğünüz ben bu indirilenC# zaman uyumsuz Web sunucusu - istemci

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

örnek bir zaman uyumsuz web sunucusu herhangi deneyimli C# geliştirici

için çocuk oyuncağı olabilir Web üzerinde çalışacak temel bir modele sahip olmak.

Temel olarak, yapmam gereken şey bu web sunucusunu bir bilgisayardaki işlem olarak çalıştırıyor. Her zaman 8080'i dinliyor olacak ve bir istemci bilgisayar bir istek gönderdiğinde, bu sunucu bazı verileri işleyecek ve bir ip olarak sonuç gönderecek.

I (olduğu gibi işlevseldir) bu kodla küçük proje hazırlandı, ancak çizginin

client.Send(message); 

yürütür zaman olsun tüm boş sayfa

en fazla tarayıcıda bir hatadır, ya da

I (mesaj) ile göndermek için HTTP başlıklarını tanımlamak gerekir şüpheli ama istekli

herkes yardımcı olmak için hiçbir şans ile bu konuda web'de arama edilmiştir?

Teşekkürler! Eğer düzgün çalışması gereken veri bu deliğin bloğunu gönderirseniz

cevap

4

Bu

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] 

gibi bir şey gerekiyor.

Düzenleme: Bu Yöntem kullanabilirsiniz

:

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

Ve Ana() içinde

- Yöntem değiştirmek gerekir

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

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

; daha sonra

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

hepsi

client.Send(message); 

önce.

+0

Bahşiş için teşekkürler! Biraz googling yapıyorum ama HTTP başlıklarını oluşturmanın bir yolunu bulamıyorum ... yapıştırdığım koda dayalı bir link veya örnek verebilir misiniz? Tekrar teşekkürler! – jprealini

+0

Üzerinde çalışıyor. Komik Bilgi: Kodunuzu kopyaladım, derledim ve işe yarıyor: -D – Tokk

+0

Vay, harika! Başka bir Komik Gerçeklik: Çalıştığım başka bir test projesinde buna benzer bir yöntem vardı ve bunu burada açıkladığınız gibi yapabilmeyi başardı ve mükemmel bir şekilde çalıştı ... Bir milyon teşekkürler ... Sanırım hala böyle bir nokta ya da şeyler atayamazsınız, ama bilmeliydim ki eğer sana verebilecek olursak ... Teşekkürler! – jprealini