繁体   English   中英

为什么此f#回显服务器不能被许多客户端连接?

[英]Why this f# echo server can't be connected by many clients?

我写这个回显服务器:

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行:let line = sr.ReadLine()

和客户端引发异常:System.Net.Sockets.SocketException:由于目标计算机被主动拒绝,无法在第16行连接:var client = new TcpClient(“ localhost”,2000);

我不知道为什么,请帮助我

您的问题是客户端打开了一个连接,然后立即将其关闭。

但是,服务器在终止连接之前需要客户端发出"quit"消息。 因此,服务器向客户端发送"welcome" ,然后进入loop 在循环内部,将调用sr.ReadLine() ,它等待客户端通过网络发送内容。

客户端从不发送任何东西。 它将关闭连接。 因此,服务器对ReadLine的调用会因SocketException被中止(强制关闭...)。 而且您不处理此异常,因此服务器死了。

然后,客户端尝试再次连接,而不再有服务器在监听。 客户端无法连接,您会看到另一个SocketException (正在主动被拒绝...)。

您应该保护服务器代码,以防客户端断开连接而不必先说"quit"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM