在TCP客户端上持续监听

时间:2017-12-16 17:00:30

标签: c# xamarin c#-4.0 tcp xamarin.forms

有人可以指导我继续使用C#监听TCP客户端。

我能够发送命令并接收响应。但我的要求是,一旦我们建立连接,服务器将发送消息,我需要保持连接打开。

出于各种原因(例如性能),我不想遵循轮询机制。我需要在移动客户端上工作(使用Xamarin进行开发)。

我编写了以下代码,但它没有按预期工作。它连接到服务器并发送消息。但是没有收到任何消息/无法处理收到的响应。

class Program
{
    public static void Main(String[] args)
    {   
        var client = new SocketClient();
        client.Connect();

        client.InitConnection();
        client.Listen(Listen);
    }

    private static bool Listen(byte[] buffer)
    {
        if (buffer != null)
        {
            Console.WriteLine($"{DateTime.Now}: response received");
            string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
        }
        else
        {
            Console.WriteLine($"{DateTime.Now}: Null buffer");
        }

        return true;
    }
}

public class SocketClient
{
    private bool terminate_listening = false;
    private TcpClient mainClient = null;

    public SocketClient()
    {
        mainClient = new TcpClient();
    }

    public bool Connected => mainClient.Connected;

    public void Connect()
    {
        var port = 5020;
        mainClient.Connect("host", 5020);
    }

    public void InitConnection()
    {

        Write($"some message");
    }

    public void Write(string message)
    {
        // Translate the passed message into ASCII and store it as a Byte array.
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message + "(char)4");
        NetworkStream stream = mainClient.GetStream();
        // Send the message to the connected TcpServer. 
        stream.Write(data, 0, data.Length);
        Console.WriteLine("Sent: {0}", message);
    }

    const int MAX_PACKET_SIZE = 1024;

    public void Listen(Func<byte[], bool> processDataFunc)
    {
        Console.WriteLine("in listen");
        Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];

        if (!this.Connected)
        {
            this.Connect();
        }
        NetworkStream stream = mainClient.GetStream();

        while (!this.terminate_listening)
        {
            while (stream.Read(data_buffer, 0, data_buffer.Length) > 0)
            {
                processDataFunc(data_buffer);
            }
        }
    }
}

谢谢,

纳雷什

0 个答案:

没有答案