Как убедиться, что Networkstream читает все данные перед возвратом C # - PullRequest
0 голосов
/ 03 сентября 2018

В настоящее время я работаю над побочным проектом, который связывается с NASA JPL для получения данных о Солнечной системе. Я принципиально новичок во всем, что связано с сетью, и у меня возникли проблемы с пониманием того, как правильно читать сетевой поток.

Этот код - это то, что мне удалось собрать вместе, что технически работает, но не очень надежно. Проблема в том, что если вы часто отправляете команды, я часто не могу прочитать ответ, а при более высоком пинге в Интернете почти невозможно получить какой-либо ответ.

Я пытался решить эту проблему с помощью исследования beginread или asyncread, но это действительно вне моего уровня знаний.

Я понимаю, что мне нужно, чтобы код ожидал ответа, прежде чем все прочесть, а затем вернул полученное сообщение. Если кто-то может помочь мне в этом, это будет очень ценить:)

 public void ServerSocket(string ip, int port)
    {
        try
        {
            client = new TcpClient(ip, port);
            Console.WriteLine("Connected to server.");
            today = DateTime.Now;
            tomorrow = today.AddDays(1);
        }
        catch (SocketException)
        {
            Console.WriteLine("Failed to connect to server");
            return;
        }

        //Assign networkstream
        networkStream = client.GetStream();

        //start socket read/write thread
        readWriteThread = new Thread(readWrite);
        readWriteThread.Start();

    }

    private void readWrite()
    {
        string command, recieved;
        bool title = false;

        //Read first thing given
        recieved = JplRead();
        Console.WriteLine(recieved);

        //Set up connection loop
        while (true)
        {
            Console.Write("Response: ");
            command = Console.ReadLine();


            if (command == "exit")
                break;

            JplWrite(command);
            Thread.Sleep(500);
            recieved = JplRead();

            Console.WriteLine(recieved);
        }

        Console.WriteLine("Disconnected from server");
        networkStream.Close();
        client.Close();
    }


    /// <summary>
    /// Converts message string into bytes and then sends them to JPL
    /// </summary>
    /// <param name="message"></param>
    public void JplWrite(string message)
    {
        message += Environment.NewLine;
        byte[] messageBytes = Encoding.ASCII.GetBytes(message);
        networkStream.Write(messageBytes, 0, messageBytes.Length);
        networkStream.Flush();
    }

    /// <summary>
    /// Reads network stream, has a buffer of 1024 bytes but reads all data through networkStream.DataAvailable
    /// </summary>
    /// <returns></returns>
    public string JplRead()
    {
        byte[] data= new byte[1024];
        StringBuilder recieved = new StringBuilder();

        int numberOfBytesRead = 0;

        // Incoming message may be larger than the buffer size, therefore reads all available data through this loop before stitching it togheter. 
        do
        {
            numberOfBytesRead = networkStream.Read(data, 0, data.Length);
            recieved.AppendFormat("{0}", Encoding.ASCII.GetString(data, 0, numberOfBytesRead));
        }
        while (networkStream.DataAvailable);

        return recieved.ToString();
    }
}
...