Ergebnis 1 bis 17 von 17
  1. #1
    Mitglied Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard [C#] Peer To Peer Chat

    Liebe community,
    Ich hab wieder mal ein Problem, ich hab ein kleinen Chat geschrieben. Er funktioniert so weit eigentlich gut aber manchmal gehen Nachrichten einfach verloren oder sie werden erst extrem spät empfangen. Jetzt hab ich keine Ahnung an was das liegt? Beziehungsweise weise sonstige Verbesserungs Verschläge sind immer gern gesehen.

    Die zweite frage die ich hätte ist, momentan werden die Nachrichten von der Priorität und dem Username einfach mit einem Trennzeichen auseinander gehalten und es gibt Probleme wenn diese Zeichen in der Nachricht vorkommen, wie könnte man das anders lösen?

    Und eine weitere frage die ich mir gestellt habe ist wie man so was ähnliches wie ein Broadcast macht um anzuzeigen wer alles online ist, ohne jedes mal eine TCP connection aufzubauen was extrem langsam ist.

    Der Quell code

    Spoiler: 


    TcpComunication - ist die Klasse über die fast die ganze Kommunikation lauft
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    using System.Text.RegularExpressions;
    
    namespace PeerToPeerChat
    {
        public class TcpComunication
        {
            private const Int32 port = 6666;
            private const string seperator = "$|$";
            private TcpListener listen;
            private Thread empfangenThread;
    
            public event EventHandler MessageEmpfangen;
    
            public TcpComunication()
            {
                empfangenThread = new Thread(new ThreadStart(Empfangen));
                empfangenThread.Start();
            }
    
            public string GetMyIp()
            {
                string HostName = System.Net.Dns.GetHostName();
                IPHostEntry hostInfo = Dns.GetHostByName(HostName);
                return hostInfo.AddressList[0].ToString();
            }
    
            public bool IsCorrectIp(string adresse)
            {
                Regex reg = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
                bool test = reg.IsMatch(adresse, 0);
                return test;
            }
    
            public string GetIpByHostname(string hostName)
            {
                try
                {
                    IPHostEntry hostEintrag = Dns.GetHostEntry(hostName);
                    return hostEintrag.AddressList[0].ToString();
                }
                catch (Exception)
                {
                    throw new ArgumentException((String.Format("System{0}0{1}Es wurde kein Host gefunden.", seperator)));
                }
            }
    
            public void Senden(IPAddress ipAdress, string message, bool wichtig, string username)
            {
                Byte[] data = System.Text.Encoding.Unicode.GetBytes(string.Format("{0}{1}{2}{3}{4}", username, seperator, Convert.ToInt16(wichtig), seperator, message));
                try
                {
                    TcpClient client = new TcpClient(ipAdress.ToString(), port);
                    NetworkStream stream = client.GetStream();
                    stream.Write(data, 0, data.Length);
    
                    stream.Close();
                    client.Close();
                }
                catch (Exception)
                {
                    throw new ArgumentException(string.Format("System{0}0{1}Es konnte keine Verbindung hergestellt werden",seperator));
                }
            }
    
            public void Empfangen()
            {
                IPAddress ipAdress;
                try
                {
                    ipAdress = IPAddress.Parse(GetMyIp());
                    listen = new TcpListener(ipAdress, port);
    
                    listen.Start();
                }
                catch (Exception)
                {
                    throw new ArgumentException(string.Format("System{0}0{1}der port {3} ist Blockiert", seperator, seperator, port.ToString()));
                }
    
                TcpClient client;
                NetworkStream stream;
    
                try
                {
                    while (true)
                    {
                        client = listen.AcceptTcpClient();
                        stream = client.GetStream();
    
                        //Buffer
                        Byte[] byteBuffer = new Byte[256];
                        string data = string.Empty;
                        Int32 i;
    
                        while ((i = stream.Read(byteBuffer, 0, byteBuffer.Length)) != 0)
                        {
                            data += System.Text.Encoding.Unicode.GetString(byteBuffer, 0, i);
                        }
                        if (data != string.Empty)
                        {
                            if (MessageEmpfangen != null)
                            {
                                MessageEmpfangen(string.Format("{0}", data), new EventArgs());
                            }
                        }
                        client.Close();
                    }
                }
                catch (Exception)
                {
                }
            }
    
            public void stopThread()
            {
                listen.Stop();
                empfangenThread.Abort();
            }
        }
    }
    Und das ist der code hinter meiner WindowsForm
    Code:
    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.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    using System.Text.RegularExpressions;
    
    namespace PeerToPeerChat
    {
        public partial class MainForm : Form
        {
            private TcpComunication tcpComunication = new TcpComunication();
            private delegate void TextToAnzeigeListDelegate(string data);
    
            public MainForm()
            {
                InitializeComponent();
                ipTextBox.Text = tcpComunication.GetMyIp();
                tcpComunication.MessageEmpfangen += new EventHandler(TcpComunication_MessageEmpfangen);
            }
    
            private void TcpComunication_MessageEmpfangen(object sender, EventArgs e)
            {
                anzeigeListView.Invoke(new TextToAnzeigeListDelegate(TextToAnzeigeList), string.Format("{0}", (string)sender));
            }
    
            private void TextToAnzeigeList(string daten)
            {
                string[] nachrichtDaten = daten.Split(new string[] { "$|$" }, StringSplitOptions.None);
    
                string[] anzeigeArray = new string[2];
                if (nachrichtDaten.Length == 3)
                {
                    anzeigeArray[0] = nachrichtDaten[0];
                    anzeigeArray[1] = nachrichtDaten[2];
                }
                else
                {
                    anzeigeArray[0] = "Unbekant";
                    anzeigeArray[1] = nachrichtDaten[0];
                }
    
                ListViewItem einListViewItem = new ListViewItem(anzeigeArray);
                if (nachrichtDaten.Length > 1)
                {
                    if (nachrichtDaten[1] == "1")
                    {
                        einListViewItem.ForeColor = System.Drawing.Color.Red;
                    }
                }
                anzeigeListView.Items.Add(einListViewItem);
    
                anzeigeListView.EnsureVisible(anzeigeListView.Items.Count - 1);
            }
    
            private void sendenButton_Click(object sender, EventArgs e)
            {
                IPAddress ipAdress = IPAddress.Parse("127.0.0.1");
                if (!tcpComunication.IsCorrectIp(ipTextBox.Text))
                {
                    try
                    {
                        ipAdress = IPAddress.Parse(tcpComunication.GetIpByHostname(ipTextBox.Text));
                    }
                    catch (Exception)
                    {
                        ipTextBox.Text = string.Empty;
                    }
                }
                else
                {
                    ipAdress = IPAddress.Parse(ipTextBox.Text);
                }
                
                try
                {
                    tcpComunication.Senden(ipAdress, nachrichtTextBox.Text, wichtigCheckBox.Checked, Environment.UserName);
                    TextToAnzeigeList(string.Format("You$|${0}$|${1}",wichtigCheckBox.Checked, nachrichtTextBox.Text));
                }
                catch (Exception ex)
                {
                    TextToAnzeigeList(String.Format("{0}", ex.Message));
                }
            }
            
            private void TextToIpTextBox(string daten)
            {
                ipTextBox.Text = daten;
            }
    
            private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                tcpComunication.stopThread();
            }
        }
    }

  2. #2
    Mitglied Avatar von Krutius
    Registriert seit
    Sep 2006
    Beiträge
    2.662
    Danksagungen
    106

    Standard Re: [C#] Peer To Peer Chat

    1) Ein leeres catch ist böse.

    2) while(true) its böse.

    3) string.Format("{0}", data) entspricht data.ToString(). Ich empfinde das string.Format deshalb als overhead.

    4) Wieso zur Hölle tust du die Nachrichten selber serialisierst und deserialisieren?
    Mach dir ein Message Objekt auf das du stark typisiert Programmierst, und welches du mit einem geeigneten Framework (.NET stellt z.B. für XML alles bereit) in eine Auszeichnungssprache deiner Wahl (XML, JSON, etx) serialisierst und deserialisierst.

  3. #3
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    1) Ein leeres catch ist böse.
    Mach ich nur wegen dem while(true).

    2) while(true) its böse.
    Alternativen? Ich weiss das es böse ist aber ich wusste nichts besseres?

    4) Wieso zur Hölle tust du die Nachrichten selber serialisierst und deserialisieren?
    Mach dir ein Message Objekt auf das du stark typisiert Programmierst, und welches du mit einem geeigneten Framework (.NET stellt z.B. für XML alles bereit) in eine Auszeichnungssprache deiner Wahl (XML, JSON, etx) serialisierst und deserialisierst.
    Die Antwort ist einfach, da ich keine Ahnung habe wie ich das anders mache soll. Also wenn du das erklären kannst, kann ich mal versuchen das umzusetzen.

    Schon mal danke für deine Antwort.

  4. #4
    Mitglied Avatar von Krutius
    Registriert seit
    Sep 2006
    Beiträge
    2.662
    Danksagungen
    106

    Standard Re: [C#] Peer To Peer Chat

    Also, zum de- und serialisieren von Objekten findest du viel im Internet, z.B. hier.

  5. #5
    Mitglied Avatar von Avater
    Registriert seit
    Jan 2005
    Beiträge
    86
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Mich würde das Prinzip interessieren, was passiert wenn mein gegenüber offline ist?
    Wird die Nachricht dann übermittelt, sobald er online ist? Und wenn ja wo wird diese "zwischengespeichert" und dann übermittelt.

  6. #6
    Mitglied Avatar von FishDa
    Registriert seit
    Aug 2009
    Ort
    Im Norden
    Beiträge
    158
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Zitat Zitat von Avater Beitrag anzeigen
    Mich würde das Prinzip interessieren, was passiert wenn mein gegenüber offline ist?
    Wird die Nachricht dann übermittelt, sobald er online ist? Und wenn ja wo wird diese "zwischengespeichert" und dann übermittelt.
    Da es sich um einen Peer to Peer Chat handelt und er wohl auch über Sockets arbeiten wird (ohne einen genauen Blick auf den Code geworfen zu haben) wird es wohl nen Error geben, wenn das Gegenüber offline ist, da somit der Socket zurückgesetzt wird und keine Verbindung mehr besteht.

  7. #7
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    @FishDa ja so ist es, also zwischengespeichert oder so wird nichts. Es wird einfach eine Nachricht ausgegeben das der Partner nicht erreicht werden kann.

  8. #8
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    So ich hab das Projekt jetzt mal ein wenig überarbeiten.

    Spoiler: 


    Die klasse Nachricht

    Spoiler: 

    PHP-Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Serialization;
    using System.IO;

    namespace 
    PeerToPeerChat
    {
        public class 
    Nachricht
        
    {
            public 
    Nachricht() { }

            public 
    Nachricht(string namestring nachrichtInt32 wichtikeit)
            {
                
    userName name;
                
    message nachricht;
                
    priorietaet wichtikeit
            }

            private 
    string userName;
            public 
    string UserName
            
    {
                
    get 
                
    {
                    if (
    userName == string.Empty)
                        
    userName "Unbekant";
                    return 
    userName
                }
                
    set userName value; }
            }

            private 
    string message;
            public 
    string Message
            
    {
                
    get { return message; }
                
    set message value; }
            }

            private 
    Int32 priorietaet;
            public 
    Int32 Priorietaet
            
    {
                
    get { return priorietaet; }
                
    set priorietaet value; }
            }
        }


    Die Klasse TcpComunication

    Spoiler: 

    PHP-Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    using System.Text.RegularExpressions;
    using System.Xml.Serialization;

    namespace 
    PeerToPeerChat
    {
        public class 
    TcpComunication
        
    {
            private const 
    Int32 port 6666;
            private 
    TcpListener listen;
            private 
    Thread empfangenThread;
            static 
    XmlSerializer xmlSerializer;

            public 
    event EventHandler MessageEmpfangen;

            public 
    TcpComunication()
            {
                
    empfangenThread = new Thread(new ThreadStart(Empfangen));
                
    empfangenThread.Start();
                
    xmlSerializer = new XmlSerializer(typeof(Nachricht));
            }

            public 
    string GetMyIp()
            {
                
    string HostName System.Net.Dns.GetHostName();
                
    IPHostEntry hostInfo Dns.GetHostByName(HostName);
                return 
    hostInfo.AddressList[0].ToString();
            }

            public 
    bool IsCorrectIp(string adresse)
            {
                
    Regex reg = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
                return 
    reg.IsMatch(adresse0);
            }

            public 
    string GetIpByHostname(string hostName)
            {
                try
                {
                    
    IPHostEntry hostEintrag Dns.GetHostEntry(hostName);
                    return 
    hostEintrag.AddressList[0].ToString();
                }
                catch (
    Exception ex)
                {
                    if (
    MessageEmpfangen != null)
                    {
                        
    MessageEmpfangen(new Nachricht("System"ex.Message1), new EventArgs());
                    }
                    return 
    null;
                }
            }

            public 
    void Senden(IPAddress ipAdressstring messagebool wichtigstring username)
            {
                try
                {
                    
    TcpClient client = new TcpClient(ipAdress.ToString(), port);
                    
    NetworkStream stream client.GetStream();
                    
    xmlSerializer.Serialize(stream, new Nachricht(usernamemessageConvert.ToInt16(wichtig)));

                    
    stream.Close();
                    
    client.Close();
                }
                catch (
    Exception ex)
                {
                    if (
    MessageEmpfangen != null)
                    {
                        
    MessageEmpfangen(new Nachricht("System"ex.Message1), new EventArgs());
                    }
                }
            }

            public 
    void Empfangen()
            {
                
    IPAddress ipAdress;
                try
                {
                    
    ipAdress IPAddress.Parse(GetMyIp());
                    
    listen = new TcpListener(ipAdressport);

                    
    listen.Start();
                }
                catch (
    Exception ex)
                {
                    if (
    MessageEmpfangen != null)
                    {
                        
    MessageEmpfangen(new Nachricht("System"ex.Message1), new EventArgs());
                    }
                }

                
    TcpClient client;
                
    NetworkStream stream;

                try
                {
                    while (
    true)
                    {
                        
    client listen.AcceptTcpClient();
                        
    stream client.GetStream();

                        
    Nachricht eineNachricht = (Nachricht)xmlSerializer.Deserialize(stream);
                        if (
    eineNachricht != null)
                        {
                            if (
    MessageEmpfangen != null)
                            {
                                
    MessageEmpfangen(eineNachricht, new EventArgs());
                            }
                        }
                        
    client.Close();
                    }
                }
                catch (
    Exception)
                {
                    
    //if (MessageEmpfangen != null)
                    //{
                    //    MessageEmpfangen(new Nachricht("System", ex.Message, 1), new EventArgs());
                    //}
                
    }
            }

            public 
    void stopThread()
            {
                
    listen.Stop();
                
    empfangenThread.Abort();
            }
        }


    Spoiler: 

    PHP-Code:
    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.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    using System.Text.RegularExpressions;

    namespace 
    PeerToPeerChat
    {
        public 
    partial class MainForm Form
        
    {
            private 
    TcpComunication tcpComunication = new TcpComunication();
            private 
    delegate void AnzeigeListFuellenDelegate(Nachricht eineNachricht);

            public 
    MainForm()
            {
                
    InitializeComponent();
                
    ipTextBox.Text tcpComunication.GetMyIp();
                
    tcpComunication.MessageEmpfangen += new EventHandler(TcpComunication_MessageEmpfangen);
            }

            private 
    void TcpComunication_MessageEmpfangen(object senderEventArgs e)
            {
                
    anzeigeListView.Invoke(new AnzeigeListFuellenDelegate(AnzeigeListFuellen), (Nachricht)sender);
            }

            private 
    void AnzeigeListFuellen(Nachricht eineNachricht)
            {
                if (
    eineNachricht != null)
                {
                    
    string[] anzeigeArray = new string[2];
                    
    anzeigeArray[0] = eineNachricht.UserName;
                    
    anzeigeArray[1] = eineNachricht.Message;
                    
    ListViewItem einListViewItem = new ListViewItem(anzeigeArray);
                    if (
    eineNachricht.Priorietaet == 1)
                    {
                        
    einListViewItem.ForeColor System.Drawing.Color.Red;
                    }
                    
    anzeigeListView.Items.Add(einListViewItem);

                    
    //damit die listView mit scrollt
                    
    anzeigeListView.EnsureVisible(anzeigeListView.Items.Count 1);
                }
            }

            private 
    void sendenButton_Click(object senderEventArgs e)
            {
                
    IPAddress ipAdress IPAddress.Parse("127.0.0.1");
                if (!
    tcpComunication.IsCorrectIp(ipTextBox.Text))
                {
                    try
                    {
                        
    ipAdress IPAddress.Parse(tcpComunication.GetIpByHostname(ipTextBox.Text));
                    }
                    catch (
    Exception)
                    {
                        
    ipTextBox.Text string.Empty;
                    }
                }
                else
                {
                    
    ipAdress IPAddress.Parse(ipTextBox.Text);
                }
                
                try
                {
                    
    tcpComunication.Senden(ipAdressnachrichtTextBox.TextwichtigCheckBox.CheckedEnvironment.UserName);
                    
    AnzeigeListFuellen(new Nachricht("You"nachrichtTextBox.TextConvert.ToInt32(wichtigCheckBox.Checked)));
                }
                catch (
    Exception ex)
                {
                    
    AnzeigeListFuellen(new Nachricht("System"ex.Message,1));
                }
            }

            private 
    void MainForm_FormClosing(object senderFormClosingEventArgs e)
            {
                
    tcpComunication.stopThread();
            }
        }



    Die fragen haben sich eigentlich nicht seit dem Start Post geändert. Weiter Hinweise oder Ratschläge sind gern gesehen.

    Edit: Shit sorry für den dopple Post!

  9. #9
    Mitglied Avatar von FishDa
    Registriert seit
    Aug 2009
    Ort
    Im Norden
    Beiträge
    158
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Bei C spezifischen Fragen kann ich dir leider nicht helfen, nur im Allgemeinen.

    Warum verschickst du anstatt von Textnachrichten keine "Serialized Objects", die Datenfelder für die Priorität, den Usernamen etc beinhalten? Du musst dann nicht versuchen, alles aus dem String rauszulesen.

    Zum "Online Melder":
    Lass den Server (oder den Peer, der die Kommunikation steuert) doch einfach ab und zu eine Liste mit allen aktiven Clients an alle Clients schicken. Daraus bastelst du dir dann ne schöne Liste.

  10. #10
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    Warum verschickst du anstatt von Textnachrichten keine "Serialized Objects", die Datenfelder für die Priorität, den Usernamen etc beinhalten? Du musst dann nicht versuchen, alles aus dem String rauszulesen.
    Mach ich ja?

  11. #11
    Mitglied Avatar von FishDa
    Registriert seit
    Aug 2009
    Ort
    Im Norden
    Beiträge
    158
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Die zweite frage die ich hätte ist, momentan werden die Nachrichten von der Priorität und dem Username einfach mit einem Trennzeichen auseinander gehalten und es gibt Probleme wenn diese Zeichen in der Nachricht vorkommen, wie könnte man das anders lösen?
    Dann versteh ich diesen Teil deiner Frage nicht, könntest du das etwas genauer beschreiben?

  12. #12
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    Zitat Zitat von FishDa Beitrag anzeigen
    Dann versteh ich diesen Teil deiner Frage nicht, könntest du das etwas genauer beschreiben?
    Das kann ich nach voll ziehen, die Frage hat Krutius ja schon beantwortet und ich habs auch umgesetzt aber vergessen dazu zu schreiben. sry ..

  13. #13
    Mitglied Avatar von Avater
    Registriert seit
    Jan 2005
    Beiträge
    86
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Zitat Zitat von Tabletop-Player Beitrag anzeigen
    @FishDa ja so ist es, also zwischengespeichert oder so wird nichts. Es wird einfach eine Nachricht ausgegeben das der Partner nicht erreicht werden kann.
    So rein interesse halber, wie wäre es denn möglich einen asynchronen Chat umzusetzen. Bei dem Man auch Nachrichten versenden kann, wenn der Gegenüber offline ist bzw. er sie erhält wenn ich offline bin? Diese müssten dann doch irgendwo zentral in einer bestimmten Form gespeichert werden und von beiden Parteien beim nächsten Online-Gang empfangen werden

  14. #14
    Mitglied

    (Threadstarter)

    Avatar von Tabletop-Player
    Registriert seit
    Mar 2010
    Ort
    überall ab 650kb/s
    Beiträge
    909
    Danksagungen
    3

    Standard Re: [C#] Peer To Peer Chat

    Naja man könnt diese Nachrichten sich merken und sie senden wenn der Andere online ist. Allerdings müsse beide Rechner dazu onlien sein.

  15. #15
    Mitglied Avatar von Avater
    Registriert seit
    Jan 2005
    Beiträge
    86
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Müssten beiden dafür online sein? Wenn die Nachricht doch zentral gespeichert ist müsste ja quasi nur der Empfänger online sein und die entsprechende Nachricht erhalten.

    Das Chat Programm müsste demnach die Nachricht und den Empfänger abgreifen...oje das ist doch schon was komplizierter

  16. #16
    Mitglied Avatar von FishDa
    Registriert seit
    Aug 2009
    Ort
    Im Norden
    Beiträge
    158
    Danksagungen
    0

    Standard Re: [C#] Peer To Peer Chat

    Nein, viel schwieriger wäre das nicht. Die Chat Nachrichten werden ja bereits als Objekte verschickt, denen müsste man nur noch ein Empfänger Feld hinzufügen.

    Die Nachrichten, die dann verschickt werden, wenn der Empfänger offline ist, werden dann einfach so lange auf dem Server gespeichert (vll. auch als Volle Konversation) bis der Empfänger das nächste mal online ist.

    Dann werden die Nachrichten einfach ganz regulär nach dem Anmelden verschickt.

    Dies setzt natürlich einen Zentralen Server vorraus, der die Gespräche verwaltet, womit es kein Peer to Peer Chat mehr wäre.

    Soll es weiterhin ein Peer to Peer Chat bleiben, müssen in der Tat beide Teilnehmer online sein, da die (offline geschickten) Nachrichten solange beim Sender bleiben, bis beide gleichzeitig online sind.

    Zusätzlich müssten die Nachrichten bei dieser Version einen TimeStamp kriegen, damit sie an der richtigen Stelle eingefügt werden (es kann ja passieren, dass beide Teilnehmer Offline Nachrichten verschicken).

  17. #17
    Mitglied Avatar von sumisumi
    Registriert seit
    Jan 2008
    Beiträge
    4.296
    Danksagungen
    34

    Standard Re: [C#] Peer To Peer Chat

    Zitat Zitat von Tabletop-Player Beitrag anzeigen
    So ich hab das Projekt jetzt mal ein wenig
    Zu deiner Nachricht Klasse:
    - Unbekannt schreibt man mit doppel n.
    - Außerdem prüfst du nur im Setter auf String.Empty, im Konstruktor aber nicht.
    - Wozu sind die Setter überhaupt da, diese Klasse sollte nur öffentliche Getter haben aber keine Setter
    - Google mal nach auto implemented properties, spart Code und erhöht Lesbarkeit

    Zu deiner TcpComunication Klasse:
    - Communication schreibt man mit doppel m.
    - IsCorrectIp akzeptiert 999.999.999.999
    - Den Nullcheck für MessageEmpfangen kannst du dir sparen wenn du manuell einen leeren Eventhandler hinzufügst ( MessageEmpfangen += delegate {}; )
    - Thread.Abort() ist böse, setzte lieber ein bool abort = true und checke das in deinem Empfangen Thread ( while(!abort) { } statt while(true) { } ), damit kannst du den Thread aus sich selbst heraus sauber beenden.

  18.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •