2016-03-30 15 views
-1

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.

+0

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. –

+0

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

+0

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ü –

cevap

1

Kodunuzda hala bazı tuhaf şeyler oluyor. Kullanmakta olduğunuz Stream.CanRead'u kullanmanın bir nedeni yok ve Encoding.GetString doğru aşırı yüklenme kullanmıyorsunuz. Örneğini biraz temizledim ve bazı tuhaflıklar/gereksiz bitleri düzeltdim.

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

public class TcpConnection 
{ 
    private const int BUF_SIZE = 1024; 
    private readonly byte[] buffer = new byte[BUF_SIZE]; 
    private readonly TcpClient client = new TcpClient(); 

    public void Start(IPAddress ip, int port) 
    { 
     client.BeginConnect(ip, port, ConnectCallback, null); 
    } 

    private void ConnectCallback(IAsyncResult result) 
    { 
     client.EndConnect(result); 
     Console.WriteLine("Connected!"); 
    } 

    private void StartRead() 
    { 
     if(!client.Connected) 
     { 
      Console.WriteLine("Disconnected, can't read."); 
      return; 
     } 
     NetworkStream stream = client.GetStream(); 
     stream.BeginRead(buffer, 0, BUF_SIZE, ReadCallback, stream);   
    } 

    private void ReadCallback(IAsyncResult result) 
    { 
     NetworkStream stream = (NetworkStream)result.AsyncState; 
     int bytesRead = stream.EndRead(result); 
     Console.WriteLine("Read Callback!"); 
     if (bytesRead > 0) 
     { 
      string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); 
      Console.WriteLine("Stream got \n{0}", response); 
     } 
     StartRead(); 
    } 
} 
İlgili konular