有人可以指导我继续使用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);
}
}
}
}
谢谢,
纳雷什