我写这个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);
我不知道为什么,请帮帮我
答案 0 :(得分:1)
您的问题是客户端打开连接,然后立即关闭它。
然而,服务器在终止连接之前需要来自客户端的"quit"
消息。因此,服务器向客户端发送"welcome"
,然后输入loop
。在循环内部,调用sr.ReadLine()
,等待客户端通过线路发送内容。
客户端从不发送任何内容。它关闭了连接。因此,服务器对ReadLine
的调用将以SocketException
(强制关闭...)中止。而且你没有处理这个异常,所以服务器就死了。
然后客户端再次尝试连接,不再有服务器监听。客户端无法连接,您会看到另一个SocketException
(主动拒绝...)。
您应该首先针对断开连接的客户端保护您的服务器代码,而不先说"quit"
。