Веб-прокси между интернетом и браузером смартфона
Я уже создал специальное сетевое соединение между ноутбуком Win-7 и смартфоном Samsung (Bada OS 2.0) через Wi-Fi. Я также проверил возможность подключения, изменив IP-адреса и выполнив проверку связи с моим смартфоном с ноутбука.
Теперь я хочу написать прокси-сервер, который будет установлен на моем Win-7, принимать HTTP-запросы со смартфона на порт 8080, получать веб-страницу из Интернета и передавать ее обратно на смартфон. Идея двоякая: получить доступ к Интернету на моем смартфоне и изучить сетевое программирование для мобильных устройств. Я написал следующий c-sharp код, который реализует TCPListener для получения запросов и отправки ответов, что происходит совершенно нормально:
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);
}
Приведенный выше код извлекает запрос от клиента (браузера смартфона), извлекает часть заголовков запроса и передает ее веб-серверу и передает ответ обратно на смартфон через тот же сокет клиента. Это происходит хорошо. Что не так, так это то, что веб-сервер отправляет ответ "Неверный запрос - код состояния 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?
Примечание: я не думаю, что вам нужна часть http://prahlad-tosh
в запросе GET, просто /welcome.png
Это хорошо.