Sunucumun TCP Soketi aracılığıyla dinlenmesini sağlayan bir program oluşturmaya çalışıyorum, böylece bildirim alınabilir. Örneğin, bir öğenin fiyatını güncellerseniz, TCP Sunucusuna bağlı tüm istemciler bunu söyleyen bir JSON dizesi gönderir. Buradaki fikir şudur: C# programım bu TCP Soketini çalışma süresi boyunca korur, yeni veriler olduğunda soketten okuma.TcpClient, yeni veri mevcut olduğunda okunmuyor
Sorunum, TcpClient
gönderilmesinin ilk turunu okumayı reddetmesidir. Bunu okur ve sonra tamamen çalışmayı durdurur. Kod şu şekildedir:
TcpClient _client;
static int readBytesLength = 1024;
Byte[] readBytes = new byte[readBytesLength];
private void initClientConnection() {
_client = new TcpClient();
_client.BeginConnect(SERVER_IP, SERVER_PORT, new AsyncCallback(connectCallback), _client);
}
private void connectCallback(IAsyncResult result) {
if (_client.Connected) {
Console.WriteLine("Connected!");
this.beginReading();
}
else {
Console.WriteLine("Failed to connect, trying again!");
this.initClientConnection();
}
}
private void beginReading() {
readBytes = new byte[readBytesLength];
_client.GetStream().BeginRead(readBytes, 0, readBytesLength, receiveCallback, _client.GetStream());
}
private void receiveCallback(IAsyncResult result) {
Console.WriteLine("Read Callback!");
if (_client.GetStream().CanRead) {
string response = Encoding.UTF8.GetString(readBytes);
Console.WriteLine("Stream got \n{0}", response);
}
this.beginReading();
}
Yine, yalnızca 1 toplu veri alıyorum ve yalnızca almayı durduruyorum.
Kodun hiç işe yaramadığına şaşırdım. EndConnect ve EndRead’e çağrılarınız nerede? Ayrıca herhangi bir döngüünüz yok, bu yüzden sadece müşteriye bir okuma yapmasını söylüyorsunuz. Sınıfın nasıl çalıştığını tam olarak anlamak için "TcpClient" dokümantasyonunu biraz daha çalışmanız gerektiğini düşünüyorum. –
Benim hatam, bu örneği MSDN'den kaldırdım (ve değiştirdim) ve "beginReading()" - döngüsünü aldım. receiveCallback() '->' beginReading() '-> ... yeterli olur. Ayrıca engellememek için ihtiyacım olduğu gibi bir süre (gerçek) döngü boyunca çalıştırmak istemedim. "EndConnect" ve "EndRead" öğelerinden bahsedilmemiştir. Bununla ilgili olarak hangi makaleye başvurduğunuzu öğrenebilir miyim? – Dilisqq
Kötü, "receCallback" öğesinin sonundaki "beginReading" çağrısını kaçırdım. Yine de hangi örnekleri kullandın? 'End', ' Başlat' öğesinin ayrılmaz bir ortağıdır. Örneğin, [BeginConnect'in [MSDN sayfası] (https://msdn.microsoft.com/en-us/library/ms145193%28v=vs.110%29.aspx), "EndConnect" öğesini çağırmanız gerektiğinden bahseder. Açıklamalar bölümü –