【发布时间】:2020-12-28 14:52:40
【问题描述】:
我想为我的 .NET Core 项目创建一个 TCP 侦听器。我正在使用 Kestrel 并为此配置了一个新的 ConnectionHandler
kestrelServerOptions.ListenLocalhost(5000, builder =>
{
builder.UseConnectionHandler<MyTCPConnectionHandler>();
});
所以我目前拥有的是
internal class MyTCPConnectionHandler : ConnectionHandler
{
public override async Task OnConnectedAsync(ConnectionContext connection)
{
IDuplexPipe pipe = connection.Transport;
PipeReader pipeReader = pipe.Input;
while (true)
{
ReadResult readResult = await pipeReader.ReadAsync();
ReadOnlySequence<byte> readResultBuffer = readResult.Buffer;
foreach (ReadOnlyMemory<byte> segment in readResultBuffer)
{
// read the current message
string messageSegment = Encoding.UTF8.GetString(segment.Span);
// send back an echo
await pipe.Output.WriteAsync(segment);
}
if (readResult.IsCompleted)
{
break;
}
pipeReader.AdvanceTo(readResultBuffer.Start, readResultBuffer.End);
}
}
}
从 TCP 客户端向服务器应用程序发送消息时,代码可以正常工作。 await pipe.Output.WriteAsync(segment); 行现在就像一个回声。
出现一些问题
- 我应该向客户端发回什么响应,以免超时?
- 我应该什么时候发回响应?
readResult.IsCompleted什么时候返回 true? - 我应该如何更改代码以获取客户端发送的整个消息?我是否应该将每个
messageSegment存储在List<string>中,并在readResult.IsCompleted返回true 时将其加入单个字符串?
【问题讨论】: