我正在玩一個用F#編寫的簡單網絡服務器。正如我已經注意到了,如果我打刷新在Firefox中,一些嘗試後,我得到一個錯誤頁面,指出:Tcplistener隨機重置連接
連接被重置
,而該頁面被加載到服務器連接被重置。
爲什麼看起來會隨機發生這種情況(將積壓量增加到1000並沒有幫助)?另外,爲什麼Firefox是顯示我的網絡服務器響應的唯一瀏覽器?我猜我的回答是無效的,對嗎?
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(循環)'看起來確實錯了.. – ildjarn
是否有可能是因爲你的內容長度是不正確的? –
調用'Async.Start' _looks_錯誤,但我認爲沒有什麼技術上的錯誤(它看起來有點混亂)。 –