将邮件发送到TCPListener

问题描述

我想创建一个侦听传入消息的.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);
        }
    }
}

向该侦听器发送消息时,客户端本身会超时。如您所见

enter image description here

我试图通过添加此行来解决

tcpClient.Close();

但是我得到这个错误

enter image description here

如何在不出错的情况下将消息发送到该服务器?

解决方法

问题是您将客户端套接字丢弃在循环中。建立客户端套接字后,您需要保持该套接字有效。

这不是正确的“服务器”代码,但是它将向您显示我的意思并解决您的问题:

[['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();
        }
    }
}