F# 为什么这个f echo服务器不能被许多客户端连接?
我写这个echo服务器:F# 为什么这个f echo服务器不能被许多客户端连接?,f#,F#,我写这个echo服务器: let listener=new TcpListener(IPAddress.Parse("127.0.0.1"),2000) let rec loop (client : TcpClient,sr : StreamReader, sw : StreamWriter) = async { let line=sr.ReadLine() sw.WriteLine(line) if line="quit" then
let listener=new TcpListener(IPAddress.Parse("127.0.0.1"),2000)
let rec loop (client : TcpClient,sr : StreamReader, sw : StreamWriter) =
async {
let line=sr.ReadLine()
sw.WriteLine(line)
if line="quit" then
client.Close()
else
return! loop(client,sr,sw)
}
let private startLoop (listener:TcpListener) =
while true do
let client = listener.AcceptTcpClient()
let stream = client.GetStream()
let sr = new StreamReader(stream)
let sw = new StreamWriter(stream)
sw.AutoFlush <- true
sw.WriteLine("welcome")
Async.Start(loop (client,sr,sw))
[<EntryPoint>]
let main argv =
listener.Start()
startLoop(listener)
0
当我打开一两个telnet窗口测试它时,它工作得很好
但是当我编写这个测试程序来测试它时:
static void Main(string[] args)
{
for (int a = 0; a < 5; a++)
{
var client = new TcpClient("localhost", 2000);
Console.WriteLine(client.Connected);
client.close();
}
}
测试程序返回一个或两个true,但服务器引发异常:
System.Net.Sockets.SocketException:远程主机强制关闭了现有连接
在第12行中:让line=sr.ReadLine
和客户端引发异常:System.Net.Sockets.SocketException:因为目标计算机主动拒绝,无法连接
在第16行:var client=new TcpClientlocalhost,2000
我不知道为什么,请帮助我你的问题是客户端打开一个连接,然后立即关闭它 但是,服务器希望在终止连接之前收到来自客户端的退出消息。因此,服务器向客户机发送欢迎,然后进入循环。在循环内部,调用sr.ReadLine,它等待客户端通过线路发送内容 客户从不发送任何东西。它会关闭连接。所以,服务器对ReadLine的调用会中止,并强制关闭SocketException。。。。如果您不处理此异常,则服务器将死亡 然后,客户端再次尝试连接,不再有服务器侦听。客户端无法连接,您看到另一个SocketException被主动拒绝
您应该保护您的服务器代码,防止客户端断开连接而没有先退出。这次不删除,好吗?很难理解一个自动删除的问题。Async.Startoop client、sr、sw捕获的是变量,而不是存储的值。loop可以查看sr和sw变量中的任何内容,这很容易成为另一个客户端的读取器,甚至是封闭客户端谢谢!那么如何修复它呢?我不想让循环函数拥有参数:client、sr、sw,但当它们连接到服务器时,我需要先给客户端写一封欢迎信。实际上我不知道如何编写f并发tcp服务器,我也找不到一个好的示例或项目来学习,你能教我一个吗?我认为sr和sw属于一个确定的客户机,而不是其他客户机无法使用的客户机。在C中,你会遇到同样的问题-lambda捕获变量,而不是值。这意味着,当它执行时,它读取执行时变量中的任何内容,而不是构造lambda时。仅传递客户端并检索流,读写器在循环内。