问题描述
我想创建一个侦听传入消息的.NET Core TCP服务器。我创建了一个小类用于测试:
internal class Tcpserver
{
private readonly TcpListener tcpListener;
public Tcpserver()
{
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"),1234);
}
public async Task Start()
{
tcpListener.Start();
while (true)
{
TcpClient tcpClient = await tcpListener.AcceptTcpClientAsync();
NetworkStream networkStream = tcpClient.GetStream();
byte[] messageBuffer = new byte[tcpClient.ReceiveBufferSize];
int bytesRead = networkStream.Read(messageBuffer,tcpClient.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(messageBuffer,bytesRead);
Console.WriteLine("Message from tcp client: " + dataReceived);
}
}
}
向该侦听器发送消息时,客户端本身会超时。如您所见
tcpClient.Close();
但是我得到这个错误
如何在不出错的情况下将消息发送到该服务器?
解决方法
问题是您将客户端套接字丢弃在循环中。建立客户端套接字后,您需要保持该套接字有效。
这不是正确的“服务器”代码,但是它将向您显示我的意思并解决您的问题:
[['age','asc'],['name','desc']]
此解决方案可以使它正常工作,但是您不能同时将多个客户端连接到服务器上。为此,您需要使用TPL,或者在最坏的情况下,为每个客户端创建一个线程。
看看BeginRead / while (true)
{
var tcpClient = await tcpListener.AcceptTcpClientAsync();
while(true){
var messageBuffer = new byte[4096];
Console.WriteLine("Waiting for data...");
int bytesRead;
try
{
bytesRead = tcpClient.GetStream().Read(messageBuffer,messageBuffer.Length);
}catch{ break; } // disconnected
var dataReceived = Encoding.ASCII.GetString(messageBuffer,bytesRead);
Console.WriteLine($"Message from tcp client ({bytesRead} bytes): {dataReceived}");
}
}
来了解我的意思。
如何启动测试服务器?您是否已检查端口1234是否已打开?我建议通过“ telnet 127.0.0.1 1234”进行检查
如果是,您可以共享客户代码吗?
如果不能,您可以共享代码来启动服务器吗? 我已经尝试通过上面的代码运行它,并且通过 telnet 工具作为客户端对我来说效果很好
class Program
{
static void Main(string[] args)
{
TCPServer server = new TCPServer();
Console.WriteLine("Starting...");
server.Start();
Console.WriteLine("Done.");
Console.WriteLine("Press any key to quit.");
Console.ReadKey();
}
}
internal class TCPServer
{
private readonly TcpListener tcpListener;
public TCPServer()
{
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"),1234);
}
public async Task Start()
{
tcpListener.Start();
try
{
while (true)
{
TcpClient tcpClient = await tcpListener.AcceptTcpClientAsync();
NetworkStream networkStream = tcpClient.GetStream();
byte[] messageBuffer = new byte[tcpClient.ReceiveBufferSize];
int bytesRead = networkStream.Read(messageBuffer,tcpClient.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(messageBuffer,bytesRead);
Console.WriteLine("Message from tcp client: " + dataReceived);
}
}
finally
{
tcpListener.Stop();
}
}
}