Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么这个f echo服务器不能被许多客户端连接?_F# - Fatal编程技术网

F# 为什么这个f 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

我写这个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
            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时。仅传递客户端并检索流,读写器在循环内。