В настоящее время я работаю над побочным проектом, который связывается с 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();
}
}