2012-06-19 115 views
0

我已經通過wifi在我的Win-7筆記本電腦和三星智能手機(Bada OS 2.0)之間創建了一個ad-hoc網絡連接。我還檢查了連接性,通過使IP地址變得更加豐富,並從筆記本電腦上ping我的智能手機。互聯網和智能手機瀏覽器之間的網絡代理

現在,我想寫一個代理服務器,它位於我的Win-7上,接受來自8080端口智能手機的HTTP請求,從互聯網上檢索網頁,並將其傳遞迴智能手機。這個想法是雙重的:在我的智能手機上訪問互聯網,並學習有關移動設備的網絡編程。我寫了下面的C-尖銳代碼實現的TCPListener接收請求和發回的響應,這是happenning完美的罰款:

 private void listen() 
    { 
     try 
     { 
      listener.Start(); 
      while (true) 
      { 
       Socket client= listener.AcceptSocket(); 
       ProcessClient(client); 
      } 
     } 
     catch (ThreadAbortException ex) 
     { 
      WriteLog("Error occured: " + ex.Message); 
     } 
    } 

    private void ProcessClient(Socket client) 
    { 
     //extract client data 
     byte[] bytes=new byte[1024]; 
     int size = client.Receive(bytes, bytes.Length, SocketFlags.None); 

     string clientmessage = System.Text.Encoding.ASCII.GetString(bytes); 

     if (size == 0) 
      return; 

     int index1 = clientmessage.IndexOf(@" "); 
     int index2 = clientmessage.IndexOf(@" ", index1 + 1); 
     if (index1 == -1 || index2 == -1) 
     { 
      throw(new Exception()); 
     } 

     //extract client url 
     string part1 = clientmessage.Substring(index1 + 1, index2 - index1); 
     int index3 = part1.IndexOf(@"/", index1 + 8); 
     int index4 = part1.IndexOf(@" ", index1 + 8); 
     int index5 = index4 - index3; 
     string sURL= part1.Substring(index1 + 4, part1.Length - index5 - 8); 

     //send request to web server 
     IPHostEntry serverHost = Dns.GetHostEntry(sURL); 
     string[] aliases = serverHost.Aliases; 
     IPAddress[] addresses = serverHost.AddressList; 
     IPEndPoint serverEP = new IPEndPoint(addresses[0], 80); 
     Socket server = new Socket((addresses[0].AddressFamily), SocketType.Stream, ProtocolType.Tcp); 
     server.Connect(serverEP); 

     //server.Send(bytes, bytes.Length, SocketFlags.None); 
     byte[] sendbytes = new byte[1024]; 
     size = System.Text.Encoding.ASCII.GetBytes(clientmessage, 0, clientmessage.Length, sendbytes, 0); 
     server.Send(sendbytes, sendbytes.Length, SocketFlags.None); 
     //server.Send(System.Text.ASCIIEncoding.ASCII.GetBytes(clientmessage), System.Text.ASCIIEncoding.ASCII.GetByteCount(clientmessage), SocketFlags.None); 

     //read response from web server 
     byte[] rbytes = new byte[4096]; 
     string strPage = ""; 
     size = 1; 
     while (size > 0) 
     { 
      size = server.Receive(rbytes, rbytes.Length, SocketFlags.None); 
       strPage += System.Text.Encoding.ASCII.GetString(rbytes,0,size); 
     } 
     server.Shutdown(SocketShutdown.Both); 
     server.Close(); 

     //send the page back to the client 
     //bytes = System.Text.Encoding.ASCII.GetBytes(strPage); 
     bytes = new byte[strPage.Length+1]; 
     size = System.Text.Encoding.ASCII.GetBytes(strPage,0,strPage.Length,bytes,0); 
     client.Send(bytes, size, SocketFlags.None); 
    } 

上面的代碼獲取從客戶端(智能手機瀏覽器的請求),獲取請求頭部分並將其傳遞給Web服務器,並通過相同的客戶端套接字將響應中繼回智能手機。這是正常的。出現問題的是,網絡服務器正在發送「錯誤請求 - 狀態碼400」的響應。我很驚訝這發生了,因爲我所做的只是在兩個端點之間來回傳遞請求。你能分享一下這個嗎?下面是發送和接收響應頭,我得到了通過取得變量clientmessage和strPage分別請求標題:

請求:

GET http://prahlad-tosh/welcome.png HTTP/1.1 
Proxy-Connection: Keep-Alive 
Host: prahlad-tosh 
Accept: text/html, application/xml, image/vnd.wap.wbmp, image/png, image/jpeg, image/gif, image/bmp, application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.wap.multipart.mixed, multipart/mixed, application/vnd.oma.dd+xml, text/vnd.sun.j2me.app-descriptor, application/java-archive, application/vnd.youtube, */* 
Accept-Language: en 
X-Wap-Proxy-Cookie: none 
Accept-Charset: utf-8;q=1.0,iso-8859-1;q=0.6 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5380K/S5380KDDKK6; U; Bada/2.0; en-us) AppleWebKit/534.20 (KHTML, like Gecko) Dolfin/3.0 Mobile HVGA SMM-MMS/1.2.0 OPN-B 
Referer: `http://prahlad-tosh/` 

響應:

HTTP/1.1 400 Bad Request 
Content-Type: text/html; charset=us-ascii 
Server: Microsoft-HTTPAPI/2.0 
Date: Tue, 19 Jun 2012 14:10:14 GMT 
Connection: close 
Content-Length: 326 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/htm/strict.dtd"> 
<HTML><HEAD><TITLE>Bad Request</TITLE> 
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> 
<BODY><h2>Bad Request - Invalid Verb</h2> 
<hr><p>HTTP Error 400. The request verb is invalid.</p> 
</BODY></HTML> 

回答

1

編輯: 我認爲這個問題可能是服務器。 如何使用Apache或連接到google.com?

附註:我不認爲你需要在GET請求中的部分http://prahlad-tosh,只是/welcome.png是好的。

+0

但是,這是智能手機瀏覽器發送的確切標題。你認爲瀏覽器發送的標題不正確嗎?瀏覽器軟件是三星海豚瀏覽器v3.0 –

+0

我認爲問題可能是服務器,所以儘量請求google.com –

+0

www.google.co.in發送此響應,但瀏覽器窗口中沒有顯示任何內容:HTTP /1.1 200 OK Content-Type:text/html;字符集= UTF-8 內容編碼:gzip 傳送編碼:分塊 日期:星期二,2012年6月19日15時59分04秒GMT 服務器:GWS 緩存控制:私人 X-XSS-保護:1; mode = block X-Frame-Options:SAMEORIGIN 2d56 ? –