Erweiterter TCP Chat (Verschlüsselung, Flüstern, Offline-Chat, Profilbilder, Wer tippt gerade, Datei-Upload etc.)

    • VB.NET

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von xored.

      Erweiterter TCP Chat (Verschlüsselung, Flüstern, Offline-Chat, Profilbilder, Wer tippt gerade, Datei-Upload etc.)



      Hey,

      ich habe nebenbei auf der Arbeit einen kleinen Chat geschrieben, um untereinander mit den Kollegen kommunizieren zu können.
      Es war eher ein Spaß-Projekt, aber vielleicht kann es jemand gebrauchen, auch wenn mein Codestil echt grottig ist.

      Es basiert ursprünglich alles auf diesem Tutorial.

      Features
      Wer tippt gerade
      Flüstern
      Profilbilder
      Registrieren/Login
      Offline-Chat
      Öffentlicher Chat
      SQLite als Datenbank
      Online-Liste
      Rijndael-Verschlüsselung
      Onlineuser in Zahlen
      Chaträume (Entfernt)
      Datei Upload & Download
      Freunde-System
      IP Blocklist
      Private und öffentliche Pakete
      Server antispam via IP-Timeout
      Befehlauthentifizierung via Nutzername & Passwort
      Bot (Bisher nur online - Ohne Funktion)
      Chat wird in Dateien aufgeteilt (So kann eine Datei nicht voll-laufen)


      Client:







      Datenbank-Aufbau:



      Server:




      Geplante Features:

      Features
      User-Begrenzung
      Admin-Only
      Usergruppen und Permissions
      Watch together (YouTube)


      Wenn ihr das Lib-Projekt herunterladet, könnt ihr auch ganz einfach mit Befehlen und wenig Code arbeiten!

      So kann der Server gestartet werden:


      VB.NET-Quellcode

      1. Module Server
      2. Sub Main()
      3. Dim xoredTCP As New xoredServer
      4. xoredTCP.EnableBot = True 'True = Ein Bot ist immer online, False = Kein Bot ist online
      5. xoredTCP.StoreOfflineChat = True 'True = Chat wird im Room-Ordner abgespeichert
      6. xoredTCP.SendOfflineChatOnJoin = True 'True = Der Offline-Chat wird beim Joinen an den Client gesendet
      7. xoredTCP.BotName = "[Bot]xored" 'Falls ein Bot online sein soll, kann man hier den Namen ändern
      8. xoredTCP.DataBaseFileName = "Accounts.sqlite"
      9. xoredTCP.Port = 8000
      10. xoredTCP.StartServer()
      11. End Sub
      12. End Module


      Die Calls im Client:

      VB.NET-Quellcode

      1. Public Function ConnectToServer()
      2. Public Function DisconnectFromServer()
      3. Public Function SendHeartBeat(ByVal Username As String, ByVal Password As String)
      4. Public Function DownloadFile(ByVal Filename As String, ByVal Username As String)
      5. Public Function SendFile(ByVal Username As String, ByVal Basefile As String, ByVal Filename As String, ByVal UsernameAgain As String, ByVal Password As String)
      6. Public Function RequestFileList(ByVal Username As String)
      7. Public Function RequestFriendList(ByVal Target As String, ByVal TargetUsername As String, ByVal TargetPassword As String)
      8. Public Function DeleteFriend(ByVal TargetUsername As String, ByVal SenderUsername As String, ByVal SenderPassword As String)
      9. Public Function InviteFriend(ByVal TargetUsername As String, ByVal SenderUsername As String, ByVal SenderPassword As String)
      10. Public Function RequestChat(ByVal Room As String)
      11. Public Function StartTyping(ByVal SenderUsername As String, ByVal SenderPassword As String)
      12. Public Function SendChat(ByVal SenderUsername As String, ByVal Message As String, ByVal DestRoom As String, ByVal SenderPassword As String)
      13. Public Function SendPrivateChat(ByVal TargetUsername As String, ByVal SenderUsername As String, ByVal Message As String, ByVal SenderPassword As String)
      14. Public Function Login(ByVal SenderUsername As String, ByVal SenderPassword As String)
      15. Public Function Register(ByVal SenderUsername As String, ByVal SenderPassword As String)
      16. Public Function DeleteNicknameFromServer(ByVal SenderUsername As String)
      17. Public Function RequestImageFromUser(ByVal TargetUsername As String)
      18. Public Function SendStopTyping(ByVal SenderUsername As String, ByVal SenderPassword As String)
      19. Public Function UploadProfileImage(ByVal SenderUsername As String, ByVal Basefile As String)


      So wird der Client initialisiert:

      VB.NET-Quellcode

      1. Dim xoredClient As xoredClient = New xoredClient()
      2. Public ListenThread As New Threading.Thread(AddressOf Listen)
      3. Public Sub Listen()
      4. While xoredClient.client.Connected
      5. Me.Invoke(New xoredClient.DAddItem(AddressOf xoredClient.AddItem), Decrypt(xoredClient.streamr.ReadLine, xoredClient.CryptKey))
      6. End While
      7. End Sub
      8. Private Sub frmClient_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
      9. xoredClient.ConnectToServer()
      10. End Sub
      11. Private Sub frmClient_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
      12. Try
      13. xoredClient.DeleteNicknameFromServer(tbLoginUser.Text)
      14. xoredClient.DisconnectFromServer()
      15. Catch
      16. Application.Exit()
      17. End Try
      18. End Sub


      So kann man sich z.B. einloggen:

      VB.NET-Quellcode

      1. xoredClient.Login(tbLoginUser.Text, tbLoginPassword.Text)


      Oder registrieren:

      VB.NET-Quellcode

      1. If (tbRegisterPasswordRepeat.Text = tbRegisterPassword.Text) Then
      2. xoredClient.Register(tbRegisterUsername.Text, tbRegisterPassword.Text)
      3. Else
      4. MsgBox("The passwords do not match!", MsgBoxStyle.Information)
      5. End If


      Danke an @SpaceyX für die Idee mit der Verschlüsselung. Der Server sendet dem Client beim Connecten einen Random Key.
      Dieser wird zum Ver- und Entschlüsseln des Streams benutzt. Jede Connection bekommt ihren eigenen privaten Key, somit sollte ein
      Auslesen Dritter nicht möglich sein. 100% sicher ist man allerdings nie, z.B. bei einem Trojaner.

      Verweise auf die Icon-Ersteller:
      flaticon.com/authors/smashicons
      freepik.com
      flaticon.com/authors/dimitry-miroliubov

      Verweise auf verwendete Libs:
      github.com/PavelTorgashov/FastColoredTextBox
      docs.microsoft.com/de-de/dotne…/sqlite/?tabs=netcore-cli

      Um das Projekt lauffähig zu bekommen müsst ihr folgende NuGet-Pakete im Server-Projekt installieren:
      • Microsoft.Data.Sqlite
      Um das Client-Projekt lauffähig zu bekommen, müsst ihr einmal das Projekt erstellen (F7), dann könnt ihr Client.vb im Designer öffnen.

      Im Anhang findet ihr die beiden Projekte.

      Liebe Grüße,
      xored
      Dateien
      • xored Server.zip

        (1,02 MB, 104 mal heruntergeladen, zuletzt: )
      • xored Client.zip

        (433,69 kB, 112 mal heruntergeladen, zuletzt: )


      Meine Website:
      www.renebischof.de

      Meine erste App (Android):
      PartyPalooza

      Dieser Beitrag wurde bereits 32 mal editiert, zuletzt von „xored“ ()

      Changelog 12.09.2019
      • Es gibt nun 2 Chaträume
      • Paar Bugfixes
      • Fenster ist nun beliebig vergrößerbar
      • Profilbilder sind anklickbar
      • Whisperfunktion verbessert


      Meine Website:
      www.renebischof.de

      Meine erste App (Android):
      PartyPalooza

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xored“ ()

      Wow, fast schon wieder 2 Jahre her, kam mir nicht so vor.
      Habe den Hauptpost nun grundlegend überarbeitet.

      Changelog 07.07.2021
      • Chaträume vorerst entfernt
      • Datei-Upload und Download eingefügt
      • Verschlüsselung eingebunden
      • Freunde-System eingebunden
      • SQLite statt INI
      • IP-Blocklist eingefügt
      • Authentifizierung von Befehlen via Zugangsdaten
      Und einiges mehr...

      Im Hauptpost sind zusätzlich noch alle Verweise und weiteren geplante Features aufgelistet.
      Viel Spaß beim Ausbauen!

      xored


      Meine Website:
      www.renebischof.de

      Meine erste App (Android):
      PartyPalooza
      Changelog 15.07.2021 (Auch wenn das Projekt keinen interessiert :D)

      • Bildschirmübertragung eingefügt
      • Maximale Userzahl eingefügt
      Die Userbegrenzung könnt ihr so im Server einstellen:

      VB.NET-Quellcode

      1. ​xoredTCP.MaxUsers = 10


      Die Bildschirmübertragung läuft, da es TCP und kein UDP ist, recht träge. Man kann zwar zwischen 30 und 15 FPS wählen, aber
      große Unterschiede sieht man leider nicht. Aber es ist trotzdem interessant.
      Es kann (serverseitig) immer nur eine Person streamen. Erst wenn der Stream beendet ist, kann ein anderer seinen Bildschirm übertragen.
      Man könnte hier natürlich noch die Option bieten ein bestimmtes Fenster zu übertragen.



      Meine Website:
      www.renebischof.de

      Meine erste App (Android):
      PartyPalooza