[英]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.