2014-11-03 33 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,并且当您获得连接时,为其启动一个“读取”线程(在获取数据时引发一个事件)。在主应用程序中不应该有处理服务器操作的循环。

相关问题