Laden...

TCP StreamReader ReadLine() als Schleife lesen

Erstellt von speedster83 vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.629 Views
S
speedster83 Themenstarter:in
11 Beiträge seit 2009
vor 7 Jahren
TCP StreamReader ReadLine() als Schleife lesen

Hallo zusammen,

ich habe zurzeit ein Problem mit einer TCP Client Verbindung.
Ich muss von einem Server Daten lesen. Dies versuche ich in einer Schleife abzuarbeiten.

Parallel dazu, muss ich auch Informationen an den Server zurück schicken können.

Mein Problem ist, dass sich sobald die Funktion im ReadThread

 using (StreamReader reader = new StreamReader(serverStream))
                {...

durchlaufen ist, der Client die TCP IP Verbindung schließt.

Hat hierzu evtl. jemand eine Idee?
Ich bin für jede Hilfe dankbar.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TCP_IP_TEST
{
    public partial class Form1 : Form
    {
        public const char enq = (char)0x05;
        public const char ack = (char)0x06;
        public const char stx = (char)0x02;
        public const char etx = (char)0x03;
        public const char sep = (char)0x3B;

        private bool _stopReadThread;
        private Thread _readThread;
        private int _readBufferSize;
        private readonly object _readWritetLock = new object();

        TcpClient tcpClient = new TcpClient();
        StreamWriter writer;

        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        
        NetworkStream serverStream;


        public Form1()
        {
            InitializeComponent();
            Open("127.0.0.1",65050);
        }



        public void Open(string catsServerIpAddress, int catsServerIpPort)
        {
            _stopReadThread = false;
            try
            {
                IPAddress ipAddress = IPAddress.Parse(catsServerIpAddress);
                tcpClient.Connect(ipAddress, catsServerIpPort);

                serverStream = tcpClient.GetStream();
            }
            catch (Exception exc)
            {

            }

            Thread readThread = new Thread(ReceiveData);
            readThread.Start();
            _readThread = readThread;
        }

        public void Close()
        {

            Thread readThread = _readThread;
            if (readThread != null)
            {
                _readThread = null;
                _stopReadThread = true;
                readThread.Join();
            }

        }

        private void sendAck_Click(object sender, EventArgs e)
        {
            sendData(ack.ToString());
        }

        private void sendEnq_Click(object sender, EventArgs e)
        {
            sendData(enq.ToString());
        }

        private void sendCommand_Click(object sender, EventArgs e)
        {
            string dataToSend = "";

            dataToSend = //Steurzeichen -->
                         stx +
                //Richtung -->
                         "EN" +
                         ";" +
                // Komando an den Server -->
                         "A" +
                         ";" +
                // Vorgangsnummer vom eineghenden Ruf (0000 - 7FFF) -->
                         "8001" +
                         ";" +
                // Leitungsnummer vom eigehenden Ruf --> 
                         "10" +
                         ";" +
                // Arbeitsplatz Nummer -->
                         "1" +
                         ";" +
                // Eingehende Rufnummer -->
                         "021371" +
                         ";" +
                         etx;

            sendData(dataToSend);
        }

        public bool sendData(string data)
        {
            bool ret = false;


            try
            {

                writer = new StreamWriter(serverStream);
                    writer.WriteLine(data);
                    writer.Flush();

            }
            finally
            {
                // Do Nothing
            }

            return ret;

        }

        // READ THREAD
        private void ReceiveData()
        {
            var readBuffer = new byte[_readBufferSize];
            _stopReadThread = false;

            //StreamReader reader = new StreamReader(serverStream);
            while (!_stopReadThread)
            {
                int bytesRead = 0;
      
                string readData = "";
                using (StreamReader reader = new StreamReader(serverStream))
                {
                    try
                    {

                        while (reader.Peek() != -1)
                        {
                            readData = reader.ReadLine();
                        }

                        if (readData != "")
                            System.Console.WriteLine("Ausgabe: " + readData);
                    }


                    catch (Exception ex3)
                    {
                        Console.WriteLine("_ERROR:" + ex3.Message);
                    }
                }

                if (bytesRead <= 0)
                {
                    Thread.Sleep(10);
                    continue;
                }

            }

            _stopReadThread = false;
        }
    }
}


16.842 Beiträge seit 2008
vor 7 Jahren

Das using führt Dispose() aus und schließt damit den Stream.