C # tcpclient не пишет в сокет ... или, может быть, я не читаю все ответы? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь написать консольное приложение C # для взаимодействия с ПК-сервером Miler telnet . Мне удалось заставить это работать в powershell, но мой код C # не работает.

static void Main(string[] args)
{
    byte[] ReadBuffer = new byte[1024];
    string[] stringSeparators = new string[]{"READY"};

    try
    {
        TcpClient Socket = new TcpClient("myServer", 8320);

        if (Socket.Connected) {
            NetworkStream netStream = Socket.GetStream();
            string PCMSResponse = "";

            // Check for the READY prompt
            if (netStream.CanRead) {
                int byteRead = 0;
                while (netStream.DataAvailable) {
                    byteRead = netStream.Read(ReadBuffer, 0, ReadBuffer.Length);
                    PCMSResponse += Encoding.ASCII.GetString(ReadBuffer, 0 , byteRead).Trim();
                }
            } else {
                Console.WriteLine("Cannot read from myServer");
            }
            Thread.Sleep(1000);

            // Get New Trip
            if (netStream.CanWrite) {
                Byte[] PCMSCommandBuffer = Encoding.ASCII.GetBytes("PCMSNewTrip");
                netStream.Write(PCMSCommandBuffer, 0 , PCMSCommandBuffer.Length);
                Thread.Sleep(1000);
            } else {
                Console.WriteLine("Cannot write to myServer.");
            }
            if (netStream.CanRead) {
                int byteRead = 0;
                while (netStream.DataAvailable) {
                    byteRead = netStream.Read(ReadBuffer, 0, ReadBuffer.Length);
                    PCMSResponse += Encoding.ASCII.GetString(ReadBuffer, 0, byteRead).Trim();
                }
            } else {
                Console.WriteLine("Cannot read from myServer");
            }
            string[] ResponseArray = PCMSResponse.Split(stringSeparators, StringSplitOptions.None);
            int c = ResponseArray.Length - 2;
            string TripID = ResponseArray[c].Replace(System.Environment.NewLine, "").Replace("\0", "");
            Console.WriteLine(PCMSResponse);
        }
    }
    catch (SocketException)
    {
        Console.WriteLine("Unable to connect to server")
    }
}

Ожидаемый результат

ALK PCMILER SERVER READY
pcmsnewtrip
53
READY

Фактическая выработка

ALK PCMILER SERVER READY

Кажется, что я на самом деле не пишу на сервер, потому что, если бы я написал неверную команду на сервер, я бы увидел ошибку, подобную этой:

ALK PCMILER SERVER READY
pmctripnew
NO SUCH FUNCTION
READY

Я знаю, что могу написать в сокет, потому что не получаю сообщение об ошибке Cannot write to myServer.

Не уверен, что я делаю не так. (

Дайте мне знать, если вы хотите увидеть код powershell.

РЕДАКТИРОВАТЬ - Если вы собираетесь редактировать этот пост, по крайней мере, оставьте ожидаемый результат КАК ОЖИДАЕТСЯ ! Изменение ожидаемого выхода меняет цель поста. (Например, если я хочу яблоки, но вы редактируете мой пост, чтобы попросить апельсины, я не получу правильный ответ.)

1 Ответ

0 голосов
/ 17 июня 2019

Таким образом, проблема заключается в том, что метод NetworkStream.Write не заканчивает строку разделителем строки. В результате, когда я записал свои PCMSCommandBuffer байта в поток, команда никогда не обрабатывалась сервером (потому что она ожидала большего количества команды или клавиши ввода, чтобы сообщить, что вы закончили). Мое решение состояло в том, чтобы назначить поток StreamWriter. Тогда я могу использовать метод WriteLine, который отправляет терминатор строки.

streamWriter = new StreamWriter(netStream);
// Get New Trip
if (netStream.CanWrite) {
    Byte[] PCMSCommandBuffer = Encoding.ASCII.GetBytes("PCMSNewTrip");
    //netStream.Write(PCMSCommandBuffer, 0 , PCMSCommandBuffer.Length);
    streamWriter.WriteLine("PCMSNewTrip");
    //netStream.Flush();
    streamWriter.Flush();
    Console.WriteLine(PCMSCommandBuffer.Length + " PCMSNewTrip");
    Thread.Sleep(1000);
} else {
    Console.WriteLine("Cannot write to EW-APP1.");
}
...