Hallo,
ich habe mir einen TCP Server und Client gebaut und es funktioniert sehr gut und auch total stabil es fehlt wirklich nur mehr
ein kleiner Schritt und dann ist alles in Ordnung
Wenn sich ein Client mit meinem Server verbindet, dann wird der Client in eine List of <ClientData>gesteckt aber dort bleibt er für immer drin
auch wenn der client disconnected.
Ich gehe mit einem Timer jede Sekunde durch die Liste und Frag mit ab ob der Client noch da ist aber obwohl
die Client-Anwendung nicht mehr läuft bekomm ich true zurück.
Server:
Client:
ich habe mir einen TCP Server und Client gebaut und es funktioniert sehr gut und auch total stabil es fehlt wirklich nur mehr
ein kleiner Schritt und dann ist alles in Ordnung
Wenn sich ein Client mit meinem Server verbindet, dann wird der Client in eine List of <ClientData>gesteckt aber dort bleibt er für immer drin
auch wenn der client disconnected.
Ich gehe mit einem Timer jede Sekunde durch die Liste und Frag mit ab ob der Client noch da ist aber obwohl
die Client-Anwendung nicht mehr läuft bekomm ich true zurück.
Server:
C#-Quellcode
- static void ListenThread()
- {
- for (;;)
- {
- listenerSocket.Listen(0);
- _clients.Add(new ClientData(listenerSocket.Accept()));
- }
- }
- public static void Data_IN(object cSocket)
- {
- Socket clientSocket = (Socket)cSocket;
- byte[] Buffer;
- int readBytes;
- for (;;)
- {
- try
- {
- Buffer = new byte[clientSocket.SendBufferSize];
- readBytes = clientSocket.Receive(Buffer);
- if (readBytes > 0)
- {
- Packet packet = new Packet(Buffer);
- DataManager(packet);
- }
- }
- catch (SocketException e)
- {
- MessageBox.Show("A client dced");
- }
- }
- }
C#-Quellcode
- Interessante Stellen von der ClientData Klasse
- class ClientData
- {
- public Socket clientSocket;
- public Thread clientThread;
- public string temporaryIdentifier;
- public string clientIdentifier;
- public ClientData()
- {
- this.temporaryIdentifier = Guid.NewGuid().ToString();
- clientThread = new Thread(ServerForm.Data_IN);
- clientThread.Start(this.clientSocket);
- SendRegistrationPacket();
- }
- public ClientData(Socket clientSocket)
- {
- this.clientSocket = clientSocket;
- this.temporaryIdentifier = Guid.NewGuid().ToString();
- clientThread = new Thread(ServerForm.Data_IN);
- clientThread.Start(this.clientSocket);
- SendRegistrationPacket();
- }
- }
Client:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using ServerData;
- using System.Net;
- using System.Net.Sockets;
- using System.IO;
- using System.Threading;
- using Microsoft.Win32;
- namespace Client
- {
- public partial class ClientForm : Form
- {
- public static Socket master;
- public static string temporaryIdentifier;
- public static string clientIdentifier;
- public ClientForm()
- {
- InitializeComponent();
- clientIdentifier = GetUniqueIdentifierFromRegistry();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- string ip = textBox1.Text;
- master = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), 4242);
- try
- {
- master.Connect(ipe);
- Thread t = new Thread(Data_IN);
- t.Start();
- } catch
- {
- MessageBox.Show("Verbindung zum Server fehlgeschlagen.");
- Application.Exit();
- }
- }
- static void Data_IN()
- {
- byte[] Buffer;
- int readBytes;
- while (master.Connected)
- {
- try
- {
- Buffer = new byte[master.SendBufferSize];
- readBytes = master.Receive(Buffer);
- if (readBytes > 0)
- {
- DataManager(new Packet(Buffer));
- }
- } catch(SocketException e)
- {
- MessageBox.Show("Verbindung zum Server getrennt");
- Application.Exit();
- }
- }
- }
- static void DataManager(Packet p)
- {
- switch (p.packetType)
- {
- case (PacketType.Registration):
- temporaryIdentifier = p.Gdata[0];
- p.senderID = temporaryIdentifier;
- p.Gdata.RemoveAt(0);
- p.Gdata.Add(clientIdentifier);
- master.Send(p.ToBytes());
- break;
- case (PacketType.RegistrationSuccess):
- p.senderID = temporaryIdentifier;
- master.Send(p.ToBytes());
- break;
- case (PacketType.RegistrationFailed):
- MessageBox.Show(p.Gdata[0].ToString());
- Application.Exit();
- break;
- }
- }
- private string GetUniqueIdentifierFromRegistry()
- {
- return "GEHEIMEID";
- }
- private void ClientForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- master.Disconnect(false);
- master.Close();
- }
- }
- }