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;
}
}
}
Das using führt Dispose() aus und schließt damit den Stream.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code