2014-11-03 35 views
1

面臨以下問題。從文本文件讀取數據。每40毫秒,數據就會發送到服務器。服務器必須將數據讀入單獨流中的無限循環。但是這沒有發生。哪裏不對?C#TCP Server-Client:無法從客戶端無限循環接收數據

客戶:

class Client 
{ 
    private TcpClient _client; 
    private Stream _stream; 
    private Boolean _isConnected; 
    private double[] _values; 


    public Client(String ipAddress, int portNum) 
    { 
     _client = new TcpClient(); 
     _client.Connect(ipAddress, portNum); 
    } 


    public void SendValues(double[] values) 
    { 
     _values = values; 
     HandleCommunication(); 
    } 


    public void HandleCommunication() 
    { 
     _isConnected = true; 
     _stream = _client.GetStream(); 

     var dataBytes = new List<byte>(); 

     foreach (double value in _values) 
     { 
      dataBytes.AddRange(BitConverter.GetBytes(value)); 

     } 

     _client.SendBufferSize = _values.Length * sizeof(double); 
     _stream.Write(dataBytes.ToArray(), 0, _client.SendBufferSize); 
     Console.Write("Sending..."); 
     _stream.Flush(); 
    } 

發送數據:

public partial class MainWindow : Window 
{ 
    private double[] values; 
    private System.Timers.Timer timer = new System.Timers.Timer(40); 
    Client _client = new Client("127.0.0.1", 55443); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     OpenSrcFile(); 

     timer.Elapsed += TimerOnElapsed; 
     timer.Enabled = true; 
    } 


    private void TimerOnElapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("is sending..."); 
     _client.SendValues(values); 
    } 


    public void OpenSrcFile() 
    { 
     List<string> lines = File.ReadAllLines(@"file.txt").ToList(); 
     string r = lines[0]; 
     int sizeX = int.Parse(lines[1]); 
     lines.RemoveRange(0, 2); 
     values = GetValues(lines.ToArray()); 
    } 


    private double[] GetValues(string[] lines) 
    { 
     return lines.Select(line => double.Parse(line.Replace(" ", ""), CultureInfo.InvariantCulture)).ToArray(); 
    } 

服務器:

class Server 
{ 
    private TcpListener _server; 
    private Boolean _isRunning; 

    public Server(int port) 
    { 
     _server = new TcpListener(IPAddress.Parse("127.0.0.1"), port); 
     _server.Start(); 

     _isRunning = true; 
    } 

    public double[] GetData() 
    { 

      // wait for client connection 

      TcpClient client = _server.AcceptTcpClient(); 

      Console.WriteLine("Connected!"); 

      var stream = client.GetStream(); 

      byte[] buffer = new byte[256*sizeof (double)]; 


      stream.Read(buffer, 0, buffer.Length); 

      double[] newValues = new double[buffer.Length/sizeof (double)]; 



      for (int i = 0; i < newValues.Length; i++) 
      { 
       newValues[i] = BitConverter.ToDouble(buffer, i*sizeof (double)); 
      } 

      stream.Flush(); 

      return newValues; 


    } 


} 

接收數據,但由於某種原因不能正常工作

public partial class MainWindow : Window 
{ 
    private Thread _thread; 
    private double[] _values; 
    private Server _server = new Server(55443); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InitializeThread(); 
    } 


    private void InitializeThread() 
    { 
     _thread = new Thread(GetData); 
     _thread.IsBackground = true; 
     _thread.Start(); 
    } 


    private void GetData() 
    { 
     while (true) 
     { 
      _values = _server.GetData(); 
      Console.WriteLine("..."); 
     } 
    } 

} 

好的,客戶端發送一個字節數組,這部分工作正常。然後我們需要將這個字節數組放入一個單獨線程的無限循環中。就像在這個地方:

private void InitializeThread() 
{ 
    _thread = new Thread(GetData); 
    _thread.IsBackground = true; 
    _thread.Start(); 
} 


private void GetData() 
{ 
    while (true) 
    { 
     _values = _server.GetData(); 
     Console.WriteLine("..."); 
    } 
} 

但不知何故,服務器接收一個字節數組,然後什麼都沒有發生。 函數GetData你可以在代碼中找到

+2

第一個問題 - 你忽略'stream.Read(buffer,0,buffer.Length);' – 2014-11-03 18:14:27

+0

的返回值我想你需要添加更多的'Debug.WriteLine'語句,以便你有更多的處理正在發生的事情。 – Sjips 2014-11-03 18:16:30

+0

改變這一行:'stream.Read(buffer,0,buffer.Length);'進入'var bytesRead = stream.Read(buffer,0,buffer.Length);'並檢查/ debug.writeline的值。它是你期望的(即它是否與你發送的數組大小一致)? – Sjips 2014-11-03 18:28:19

回答

0

你把循環放在錯誤的地方!

您的客戶端只連接一次;哪個是對的。但是,在您的GetData函數中,您接受一個新的連接。因此,在第一次讀取之後,循環再次呼叫GetData,這在等待新的連接時阻塞,並且什麼也沒有發生。

相反,您想循環調用服務器類本身的Accept,並且當您獲得連接時,爲其啓動一個「讀取」線程(在獲取數據時引發一個事件)。在主應用程序中不應該有處理服務器操作的循環。

相關問題