为什么许多客户端无法连接此f#echo服务器?

时间:2018-02-01 08:02:19

标签: f#

我写这个echo服务器:

'use strict';

const Hapi = require('hapi');

const server = new Hapi.Server();
server.connection({ port: 3000, host: 'localhost' });

server.start((err) => {

    if (err) {
        throw err;
    }
    console.log(`Server running at: ${server.info.uri}`);
});

当我打开一个或两个telnet窗口进行测试时,它可以正常工作

但是当我编写这个测试程序来测试它时:

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

测试程序返回一个或两个true,但服务器引发异常:

System.Net.Sockets.SocketException:远程主机

强行关闭现有连接 第12行中的

:let line = sr.ReadLine()

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

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

1 个答案:

答案 0 :(得分:1)

您的问题是客户端打开连接,然后立即关闭它。

然而,服务器在终止连接之前需要来自客户端的"quit"消息。因此,服务器向客户端发送"welcome",然后输入loop。在循环内部,调用sr.ReadLine(),等待客户端通过线路发送内容。

客户端从不发送任何内容。它关闭了连接。因此,服务器对ReadLine的调用将以SocketException(强制关闭...)中止。而且你没有处理这个异常,所以服务器就死了。

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

您应该首先针对断开连接的客户端保护您的服务器代码,而不先说"quit"