TcpClient-Verbindung
Ich Schreibe eine Anwendung zum senden/empfangen von Daten zu und von einem server. Ich brauche, um eine Verbindung vor dem senden einige Daten und müssen es offen halten, so dass Benutzer kann Daten senden kontinuierlich. Die Benutzer können die Verbindung schließen, sich jederzeit durch einen Klick auf die Schaltfläche trennen. Erstellt habe ich 2 buttons, einer zum verbinden und einem trennen.
Code hinter der Schaltfläche Trennen, ist wie folgt:-
private void button1_Click(object sender, EventArgs e)
{
if (tcpclnt.Connected)
{
tcpclnt.Client.Disconnect(false);
stm.Close();
}
else
{
MessageBox.Show("Not Connected");
}
}
code hinter der Schaltfläche verbinden, ist wie folgt:-
public ASCIIEncoding asen = new ASCIIEncoding();
public TcpClient tcpclnt = new TcpClient();
public NetworkStream stm;
private void Connect_Click(object sender, EventArgs e)
{
if (!tcpclnt.Connected)
{
tcpclnt.Connect("XX.XX.XX.XX", 5500);
MessageBox.Show("Connected to server");
stm = tcpclnt.GetStream();
string sysname = "000B0000" + SystemName.Text.ToString();
byte[] sys1 = asen.GetBytes(sysname);
sys1[0] = 0; sys1[1] = 0;
sys1[2] = 0; sys1[3] = 0xB;
sys1[4] = 0; sys1[5] = 0;
sys1[6] = 0; sys1[7] = 0;
try
{
stm.Write(sys1, 0, sys1.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
MessageBox.Show("Error in Sending data");
}
if (stm.DataAvailable)
{
try
{
byte[] bb = new byte[600];
int k = 8;
k = stm.Read(bb, 0, bb.Length);
string value = ASCIIEncoding.ASCII.GetString(bb, 8, k - 8);
MessageBox.Show(value.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
MessageBox.Show("Error in Reading data");
}
}
}
else {
MessageBox.Show("Already Connected");
}
}
Nun, wenn ich auf Trennen-Taste und klicken wieder auf die Schaltfläche verbinden, es wirft eine exception auf tcpclient.connect Linie. Ich verstehe nicht, warum oder wie kann ich es lösen.
- Kann u erwähnen, welche Art von Ausnahme u r vor ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kein Experte auf diesem Thema, aber ich denke eine mögliche Lösung wäre, um ordnungsgemäß die Verbindung zu schließen, verwenden tcpclnt.Schließen(). Wenn Sie dies nicht tun, oder lassen Sie den garbage collector zu tun, es abrupt ab, dann kann man nicht verbinden (ich denke,). Den stream schließen, dann schließen Sie die tcpclnt anstatt zu trennen.
Verwenden Sie außerdem keine tcpclnt.Angeschlossen um zu überprüfen, ob ein Zusammenhang besteht. Einfach Schließen Sie es.
BEARBEITEN
Die oben nicht funktioniert. Ich weiß nicht, wie die Wiederverwendung der Steckdose. Dies ist, wie ich es geschafft habe...
Du hast erwähnt, dass re-Instanziierung des Objekts schafft zusätzliche threads. Dies könnte wahr sein, da bin ich mir unsicher, wie um dies zu prüfen. Ich öffnete den windows-Ressourcen-monitor und beobachtete, wie die Anzahl der Threads für die app und es nicht zu zeigen, einen zusätzlichen thread öffnen jedes mal.
Ihre .Disconnect () - Aufruf muss true als parameter ermöglichen die Wiederverwendung. Sie aktuell erzählen die Steckdose zu verbieten, Wiederanschluss. Siehe hier für die Dokumentation.