Как оставить порт 23 Telnet открытым, чтобы продолжить чтение данных в форме окна C # - PullRequest
0 голосов
/ 17 января 2019

Я наконец-то заставил программу работать так, как мне хотелось - это читать данные из порта telnet для каждого запуска сканирования, но теперь единственная проблема, которую я получаю, - это чтение данных, если я отображаю их в консоли, но я нужно, чтобы он отображался на моем главном дисплее, который будет многострочным текстовым полем, вы понимаете, почему я получаю это

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BarcodeReceivingApp
{
    public partial class BarcodeReceivingForm : Form
    {
        public BarcodeReceivingForm()
        {
            InitializeComponent();

        }

        private Thread _readWriteThread;
        private TcpClient _client;
        private NetworkStream _networkStream;
        private void btn_ConnectToTelnetPort_Click(object sender, EventArgs e)
        {
            // connection tcp/ip
            const string hostname = "myipaddress";
            const int port = 23;
            ServerSocket(hostname, port);
            //Connect();

        }


        public void ServerSocket(string ip, int port)
        {
            try
            {
                _client = new TcpClient(ip, port);
                lbl_ConnectionMessage.Text = @"Connected to server.";
            }
            catch (SocketException)
            {
                MessageBox.Show(@"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()
        {
            var received = "";

            //Read first thing givent o us
            received = Read();
            //Console.WriteLine(received);
            txt_BarcodeDisplay.Text = received + Environment.NewLine;

            //txt_BarcodeDisplay.Text = recieved.ToString();


            //Set up connection loop
            while (true)
            {
                var command = btn_StopConnection.Text;
                if (command == "STOP1")
                    break;

                //write(command);
                received = Read();
                //Console.WriteLine(received);
                txt_BarcodeDisplay.Text += received + Environment.NewLine;
            }
            // possible method to end the port connection


        }

        public string Read()
        {
            byte[] data = new byte[1024];
            var received = "";

            var size = _networkStream.Read(data, 0, data.Length);
            received = Encoding.ASCII.GetString(data, 0, size);

            return received;
        }

        private void btn_StopConnection_Click(object sender, EventArgs e)
        {
            _networkStream.Close();
            _client.Close();
        }
    }
}

Вот я добавляю ошибку и происходит из метода ReadWrite введите описание изображения здесь

1 Ответ

0 голосов
/ 17 января 2019

Так что вам нужно будет где-то цикл, чтобы ваша программа продолжала проверять поток. Обычно проще всего было с булевым индикатором, так что перечислим это:

Boolean openConnection = false;

Это должно быть на уровне класса. Затем внутри вашего метода подключения вы зацикливаетесь и слушаете. Как то так.

NetworkStream ns = server.GetStream();
openConnection = True;
            Task.Factory.StartNew(() => 
                {
                    while (openConnection)
                    {
                        ns.Read(data, 0, data.Length);
                        var stringData = Encoding.ASCII.GetString(data, 0, 1024);
                        dataToAdd.Add(stringData);
                        foreach (var list in dataToAdd)
                        {
                            txt_BarcodeDisplay.Text += list + Environment.NewLine;
                        }
                        Thread.Sleep(2000);
                    }
                }
            );

Так что это много для распаковки, но в основном вы говорите, читайте то, что приходит из сети, делайте это, пока для переменной openConnection не будет установлено значение false. Да, и поскольку мы не хотим привязывать процессор к 100%, переведите нить в спящий режим, чтобы мы проверяли только каждые 2 секунды.

Это грубое начало, но я надеюсь, что оно даст вам представление о том, в каком направлении вам следует идти.

...