简体   繁体   中英

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

I write this echo server:

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

when I open one or two telnet window to test it,it works fine

but when I write this test program to test it:

static void Main(string[] args)
    {
        for (int a = 0; a < 5; a++)
        {
            var client = new TcpClient("localhost", 2000);
            Console.WriteLine(client.Connected);
            client.close();
        }
    }

the test program return one or two true,but the server raise an exception:

System.Net.Sockets.SocketException:An existing connection was forcibly closed by the remote host

in line 12:let line=sr.ReadLine()

and client raise the exception:System.Net.Sockets.SocketException:Because the target computer actively refused, unable to connect at line 16:var client = new TcpClient("localhost", 2000);

I don't know why,please help me

Your problem is that the client opens a connection and then immediately closes it.

The server however expects a "quit" message from the client before it will terminate the connection. So the server sends a "welcome" to the client, then enters the loop . Inside the loop, sr.ReadLine() is called, which waits for the client to send something over the wire.

The client never sends anything. It closes the connection. Therefore, the server's call to ReadLine aborts with the a SocketException (forcibly closed...). And you do not handle this exception, so the server dies.

Then the client tries to connect once again, with no server listening anymore. The client can't connect and you see another SocketException (actively refused...).

You should guard your server code against clients that disconnect without saying "quit" first.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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