我正在尝试使用F#编写一个简单的Web服务器。我发现在Firefox中刷新页面时,经过几次尝试后,会出现一个错误页面,上面显示:
连接被重置
当页面正在加载时,与服务器的连接被重置了。
为什么这种情况似乎是随机发生的(将积压队列增加到1000并没有帮助)?此外,为什么Firefox是唯一显示我的Web服务器响应的浏览器?我猜我的响应不合法,是吗?
Web服务器的代码:
module Program
open System
open System.Net.Sockets
open System.IO
type TcpListener with
member this.AsyncAcceptSocket =
Async.FromBeginEnd(this.BeginAcceptSocket, this.EndAcceptSocket)
type Main =
static member Init () =
let tcpListener = new TcpListener(80)
tcpListener.Start()
let rec loop =
async{
let! socket = tcpListener.AsyncAcceptSocket
Async.Start(loop)
let stream = new NetworkStream(socket)
let streamWriter = new StreamWriter(stream)
streamWriter.WriteLine("HTTP/1.0 200 OK");
streamWriter.WriteLine("Date: Fri, 15 Nov 2011 23:59:59 GMT");
streamWriter.WriteLine("Content-Type: text/html");
streamWriter.WriteLine("Content-Length: 13540");
streamWriter.WriteLine("")
streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
streamWriter.WriteLine("<html>");
streamWriter.WriteLine("<body>");
streamWriter.WriteLine("<h1>This is the title</h1>");
streamWriter.WriteLine("</body>");
streamWriter.Write("</html>");
streamWriter.Flush()
stream.Close()
socket.Close()
}
Async.Start(loop)
Console.ReadLine()
Main.Init()
编辑
看起来问题与我在之前的解决方案中调用loop
方式无关。我将程序简化为以下内容(但问题仍然存在):
module Program
open System
open System.Net.Sockets
open System.IO
let tcpListener = new TcpListener(80)
tcpListener.Start()
while true do
let socket = tcpListener.AcceptSocket()
let stream = new NetworkStream(socket)
let streamWriter = new StreamWriter(stream)
streamWriter.WriteLine("response");
streamWriter.Flush()
stream.Close()
socket.Close()
Console.ReadLine()
Async.Start(loop)
确实看起来有问题。 - ildjarnAsync.Start
看起来有点奇怪,但实际上我认为它在技术上没有任何问题(只是看起来有点令人困惑)。 - Tomas Petricekloop
的第2行调用Async.Start
肯定不能按预期工作——那不是会尝试生成无限数量的套接字吗?或者我可能错过了关于TcpListener
行为的一些细节…… - ildjarn