2011-03-09 34 views
5

Đây có thể là một miếng bánh cho bất kỳ nhà phát triển có kinh nghiệm C#C# Async Webserver - làm thế nào để gửi dữ liệu cho khách hàng

Những gì bạn thấy ở đây là một máy chủ web không đồng bộ mẫu

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

tôi tải này từ web, để có một mô hình cơ bản để làm việc trên.

Về cơ bản những gì tôi cần làm là chạy máy chủ web này như là một quá trình trong máy tính. Nó sẽ được nghe por 8080 tất cả các thời gian, và khi một máy tính khách hàng gửi một yêu cầu, máy chủ này sẽ xử lý một số dữ liệu và gửi lại một kết quả như là một chuỗi.

Tôi tạo ra một dự án nhỏ với mã này (đó là chức năng như là), nhưng khi nó thực thi dòng

client.Send(message); 

tất cả tôi nhận được là một lỗi trong trình duyệt, hoặc ít nhất một trang trống

Tôi nghi ngờ tôi cần phải xác định tiêu đề HTTP để gửi cùng với (tin nhắn), nhưng tôi đã tìm kiếm trên web về điều này mà không có may mắn

Bất cứ ai sẵn sàng trợ giúp?

Cảm ơn!

Trả lời

4

Bạn cần một cái gì đó như thế này

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] 

Nếu bạn gửi khối lỗ này của dữ liệu mà nó nên làm việc một cách chính xác.

Edit:

Bạn có thể sử dụng phương pháp này:

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

Và trong chính bạn() - Phương pháp bạn nên thay thế

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

với

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

và sau đó chèn

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

trước

client.Send(message); 

Đó là tất cả.

+0

Cảm ơn mẹo! Tôi đã googling một chút, nhưng tôi không thể tìm thấy một cách để tạo ra các tiêu đề HTTP ... bạn có thể cho tôi một liên kết hoặc một ví dụ dựa trên mã tôi dán? Cảm ơn bạn một lần nữa! – jprealini

+0

Làm việc trên đó. Sự thật thú vị: Tôi đã sao chép mã của bạn, biên dịch nó và nó hoạt động :-D – Tokk

+0

Thật tuyệt vời! Một sự thật thú vị khác: Tôi đã có một phương pháp tương tự như vậy trong một dự án thử nghiệm khác mà tôi đang làm, và đã làm được điều này gần như chính xác như bạn mô tả ở đây, và nó hoạt động hoàn hảo ... A million thanks ... vẫn không thể chỉ định điểm hoặc nội dung như vậy, nhưng bạn nên biết tôi sẽ rất vui khi cung cấp cho bạn một số nếu tôi có thể ... Cảm ơn! – jprealini

Các vấn đề liên quan