C#混合流

时间:2014-11-04 14:58:18

标签: c# tcp stream byte

面对问题:每40毫秒向流中写入相同的字节数组。在无限循环中读取此线程。但字节数组完全错误。这可能是混合流,任何人都面临这个问题吗?

写入字节数组:

public void HandleCommunication()
    {
        var dataBytes = new List<byte>();

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

        _client.GetStream().Write(dataBytes.ToArray(), 0, dataBytes.Count);
        _client.GetStream().Flush();
    }

并且读取字节数组:在两次字节数组出错之后。

public void GetData()
    {
        TcpClient client = _server.AcceptTcpClient();
        Console.WriteLine("Connected!");

        while (true)
        {
            var stream = client.GetStream();
            Values = new double[2 * 16 * 1024];
            byte[] buffer = new byte[Values.Length * sizeof(double)];

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

当我每250毫秒读取一次数据时,数据正确!

好的,更多细节: 我有一个带有数字的文本文件。我读了它并发送:

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)
    {
        _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());
    }

}

客户代码:

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


    public Client(String ipAddress, int portNum)
    {
        _client = new TcpClient() { SendBufferSize = 2 * 16 * 1024 * sizeof(double) };
        _client.Connect(ipAddress, portNum);
        _stream = _client.GetStream();
    }


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


    public void HandleCommunication()
    {

        _isConnected = true;

        var dataBytes = new List<byte>();

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

        NetworkStream newStream = _client.GetStream();
        _client.GetStream().Write(dataBytes.ToArray(), 0, dataBytes.Count);
        _client.GetStream().Flush();

    }

}

然后服务器接收到这个字节数组,但每次都发送相同的数组。但是在两次迭代之后接受字节数组是不同的! 服务器代码:

class Server
{
    private TcpListener _server;


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

    public double[] Values { get; private set; }

    public delegate void DataUpdatedEventHandler(object sender, EventArgs args);

    public event DataUpdatedEventHandler DataUpdated;

    protected virtual void OnDataUpdated()
    {
        DataUpdatedEventHandler handler = DataUpdated;
        if (handler != null) handler(this, EventArgs.Empty);
    }


    public void GetData()
    {


        // wait for client connection

        TcpClient client = _server.AcceptTcpClient();

        Console.WriteLine("Connected!");



        while (true)
        {
            var stream = client.GetStream();

                Values = new double[2 * 16 * 1024];
                byte[] buffer = new byte[Values.Length * sizeof(double)];



                stream.Read(buffer, 0, buffer.Length); //wrong array of bytes!



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



                OnDataUpdated();

        }
    }
}

我无法理解它是什么......

1 个答案:

答案 0 :(得分:0)

看一下关于TcpClient类的MS文章: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream%28v=vs.110%29.aspx

如您所见,.Net中的流可以在字节上具有可变长度。 您应该通过以下方式获取数据:

  Encoding.UTF8.GetString (bytes);