我是套接字编程和TCP通信的新手,我正在开发一个应该从可以访问服务器但没有互联网连接的计算机接收请求(网站网址)的应用程序,然后它应该发送网站作为回应给客户。到目前为止,我已经能够成功地收听请求但是当我尝试发送响应时,浏览器会挂起。
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(ipAddress, 500);
listener.Start();
while (true)
{
Socket client = listener.AcceptSocket();
Console.WriteLine("Connection accepted.");
var childSocketThread = new Thread(() =>
{
byte[] data = new byte[100];
int size = client.Receive(data);
Console.WriteLine("Recieved data: ");
for (int i = 0; i < size; i++)
Console.Write(Convert.ToChar(data[i]));
// Reading the website in bytes using WebCLient
client.Send(RESPONSE) // Here I call the send
client.Close();
});
childSocketThread.Start();
}
listener.Stop();
我究竟做错了什么以及如何解决此问题(将回复发送回客户端)?
答案 0 :(得分:2)
如果要编写HTTP代理,则必须遵循HTTP specification中代理的每个要求。例如:
代理服务器必须分别与其客户端和它连接的源服务器(或其他代理服务器)发信号通知持久连接。每个持久连接仅适用于一个传输链路。
和
代理服务器绝不能与HTTP / 1.0客户端建立HTTP / 1.1持久连接(但请参阅RFC 2068 [33]以获取有关许多HTTP / 1.0客户端实现的Keep-Alive标头问题的信息和讨论) 。
和
- 如果代理收到包含Expect请求的请求 - 标题字段与&#34; 100-continue&#34;期待和代理 要么知道下一跳服务器符合HTTP / 1.1或 更高,或者不知道下一跳的HTTP版本 服务器,它必须转发请求,包括Expect标头 字段。
- 如果代理知道下一跃点服务器的版本是 HTTP / 1.0或更低,它不能转发请求,它必须 回复417(期望失败)状态。
- 代理应该保持记录HTTP版本的缓存 从最近引用的下一跳服务器收到的号码。
- 如果是,则代理不得转发100(继续)响应 请求消息是从HTTP / 1.0(或更早)收到的 客户端并没有包含Expect请求标头字段 &#34; 100-continue&#34;期望。这个要求超越了 转发1xx响应的一般规则(见10.1节)。
HTTP代理是一个非常复杂的野兽,对于那些在编写网络代码方面没有经验的人来说,可能是最糟糕的选择。