Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#TCP服务器客户端:can';t在无限循环中从客户端接收数据_C#_Wpf_Tcp_Client_Server - Fatal编程技术网

C#TCP服务器客户端:can';t在无限循环中从客户端接收数据

C#TCP服务器客户端:can';t在无限循环中从客户端接收数据,c#,wpf,tcp,client,server,C#,Wpf,Tcp,Client,Server,面临以下问题。从文本文件读取数据。每隔40毫秒,数据就会发送到服务器。服务器必须将数据读入单独流中的无限循环中。但这并没有发生。怎么了 客户: class Client { private TcpClient _client; private Stream _stream; private Boolean _isConnected; private double[] _values; public Client(String ipAddress, i

面临以下问题。从文本文件读取数据。每隔40毫秒,数据就会发送到服务器。服务器必须将数据读入单独流中的无限循环中。但这并没有发生。怎么了

客户:

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();
    }
好的,客户端发送一个字节数组,这部分工作正常。然后我们需要将这个字节数组放入一个单独线程中的无限循环中。就像在这个地方:

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


private void GetData()
{
    while (true)
    {
        _values = _server.GetData();
        Console.WriteLine("...");
    }
}
但不知何故,服务器只接收一次字节数组,然后什么也不发生。
函数GetData你可以在代码中找到你把循环放错位置了

你的客户只连接一次;这是正确的。但是,在
GetData
函数中,您接受一个新连接。因此,在第一次读取之后,循环再次调用
GetData
,在等待新连接时阻塞,并且什么也没有发生


相反,您希望围绕服务器类本身中的
Accept
调用进行循环,当您获得连接时,为其启动一个“Read”线程(在获得数据时引发一个事件)。处理服务器操作的主应用程序中不应存在循环。

第一个问题-您忽略了
stream.Read(buffer,0,buffer.Length)的返回值我认为您需要添加更多的
Debug.WriteLine
语句,以便对正在发生的事情有更多的控制。更改此行:
stream.Read(buffer,0,buffer.Length)
into
var bytesRead=stream.Read(buffer,0,buffer.Length)
并检查/debug.writeline该值。它是否符合您的期望(即,它是否与您发送的数组大小相对应)?
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("...");
    }
}