Laden...

Chatanwendung - Text mehren Clients zur Verfügung stellen.

Erstellt von Diablo vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.761 Views
D
Diablo Themenstarter:in
47 Beiträge seit 2011
vor 9 Jahren
Chatanwendung - Text mehren Clients zur Verfügung stellen.

Hallo,

ich habe mal testweise eine kleine Client- / Serveranwendung gebastelt. Und zum Testen so eine Art Chat daraus gebaut.

Nun bekommt der Server auch alle Nachrichten der jeweiligen Clients. Allerdings sendet der Server die Nachrichten immer nur an den anfragenden Client zurück. Mir ist nicht ganz klar wie man die Nachricht den anderen Clients ebenfalls zur Verfügung stellt.

Kann mir jemand dabei helfen?

Meine Code sieht wie folgt aus:

Server

 class Program
    {
        static void Main(string[] args)
        {
            TcpListener server = new TcpListener(5550);
            TcpClient client = default(TcpClient);
            server.Start();
            Console.WriteLine("Server started");
            Console.WriteLine("Wait for connections...");

            int counter = 0;
            while (true)
            {
                counter += 1;
                client = server.AcceptTcpClient();
                Console.WriteLine(" >> " + "Client No: " + Convert.ToString(counter) + " started!");
                HandleClient handleClient = new HandleClient();
                handleClient.StartClient(client, Convert.ToString(counter));
            }
            client.Close();
            server.Stop();
            Console.WriteLine(" >> " + "exit");
            Console.ReadLine();
        }
    }




 public class HandleClient
    {
        TcpClient client;
        Thread ctThread;
        string clientNo;

        public void StartClient(TcpClient pClient, string pClientNo)
        {
            this.client = pClient;
            this.clientNo = pClientNo;
            ctThread = new Thread(DoChat);
            ctThread.Start();
        }

        private void DoChat()
        {
            int requestCount = 0;
            byte[] bytesFrom = new byte[10025];
            string dataFromClient = null;
            byte[] sendBytes = null;
            string serverResponse = null;
            string rCount = null;
            requestCount = 0;

            while (true)
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = client.GetStream();
                    networkStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize);
                    dataFromClient = Encoding.ASCII.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                    Console.WriteLine(" >> From client-" + clientNo + " " + dataFromClient);

                    rCount = Convert.ToString(requestCount);
                    serverResponse = "Client(" + clientNo + ") " + dataFromClient;
                    sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();
                    Console.WriteLine(" >> " + serverResponse);
                }
                catch (Exception ex)
                {                    
                    Console.WriteLine(" >> " + ex.ToString());
                }                
            }
        }
    }



Client

public partial class Form1 : Form
    {
               
        private TcpClient _client;

        public Form1()
        {
            InitializeComponent();
            this.OpenConnection();
        }

        private void OpenConnection()
        {
            try
            {
                System.Net.IPAddress IP = System.Net.IPAddress.Parse("192.168.68.128");
                _client = new TcpClient();
                _client.Connect(IP, 5550);
                textBoxChat.Text = "Client Socket Program - Server Connected ...";
            }
            catch (Exception)
            {                
                throw new Exception();
            }          
        }


        private void SendMessage(string message)
        {
            NetworkStream messageStream = _client.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(message + "$");

            messageStream.Write(buffer, 0, buffer.Length);
            messageStream.Flush();

            byte[] inStream = new byte[10025];
            messageStream.Read(inStream, 0, (int)_client.ReceiveBufferSize);
            string returndata = System.Text.Encoding.ASCII.GetString(inStream);
            DisplayMessage(returndata);
        }

        private void DisplayMessage(string msgData)
        {
            textBoxChat.Text +=  "\r\n" + msgData ;
        }


        private void btnSend_Click(object sender, EventArgs e)
        {
            SendMessage(textBoxEntry.Text);
            textBoxEntry.Clear();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            _client.Close();
        }
    }
N
135 Beiträge seit 2006
vor 9 Jahren

Du sendest doch auch nur die Antwort an den sendenden Clienten. Warum erwartest Du das die Nachricht bei allen anderen auch ankommt?

Erstelle Dir eine Liste für alle Clienten die sich anmelden. Wenn dann eine Nachricht von einem Clienten kommt, sende diese an alle in der Liste enthaltenen Clienten.

Noch ein Hinweis: Jeder Client hat seinen eigenen Networkstream.

16.806 Beiträge seit 2008
vor 9 Jahren

Wenn ich Dein Code so sehe, außer den Fehler, den Neidhard genannt hatte, folgende Tipps:

  • IDisposable nutzen
  • Trennung von Logik und Oberfläche und Events nutzen
  • Die Frage wäre, ob Du das wirklich so tief via TcpClient machen willst oder ob Du nicht gleich abstraktere Elemente wie WCF nutzen willst (inkl dessen Komprimierung, Verschlüsselung...)
D
Diablo Themenstarter:in
47 Beiträge seit 2011
vor 9 Jahren

Danke für Eure Tipps! Hatte den Code gestern Abend um 2 Uhr auf die Schnelle zusammengehackt und habe noch nicht so die Ahnung von Client- / Serveranwendungen. Mittlerweile habe ich es aber geschafft den Code von der Oberfläche zu trennen und das mehrere Chatfenster die Nachricht erhalten (über ein Dictionary) 😃

War auch nur mal als Test gedacht, weil mich interessiert hat wie das funktioniert.