vb net Wie erstelle ich eine DLL für einen Chat

  • VB.NET

Es gibt 88 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Ich habe versucht den Code von einem Chat als DLL zu machen aber es funktioniert nicht ganz. Das heißt dass ich nicht weis was ich in die DLL Date einfügen muss/soll bzw. was wichtig ist.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    @CharlyChaplin, Ja aber ich weis nicht was wirklich dort für Verweise wirklich wirklich sind. Ich habe diese DLL zwar mal verwendet aber ich habe festgestellt dass die schlecht programmiert worden ist und auch das diese DLL auch ziemlich viel Internetleistung braucht.

    @ichduersie', ich möchte daraus etwas lernen und aber auch später die weitergeben.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Die Frage ist, wie stellst du dir das ganze von der Architektur her vor? Irgendwelche Pläne bezüglich Klassen, Schnittstellen etc. musst du ja haben. Wenn du uns grob verrätst, wie man mit der DLL kommunizieren können soll, können wir dir bestimmt helfen und Ansätze geben. (Auch wenn du nur fertigen Code willst, aber egal...)

    Thiemo1991 schrieb:

    Das heißt dass ich nicht weis was ich in die DLL Date einfügen muss/soll bzw. was wichtig ist.

    Radinator schrieb:

    Bei der DLL geht es ja auch nur darum, dass du gleichen Code, den du in einem oder zwei Projekten verwendest, wieder verwenden kannst.
    Deswegen:

    Radinator schrieb:

    Als Bsp: Sicherlich wirst du eine Classe "Connection" erstellen, welche die aktuelle Verbindung des Users zum Server managed. Der Server hingegen hat eine Liste von Connections. Wenn die Klasse bisher in deinem Chat-Projekt hattest, ist diese z.B. ein super Ansatz zum Auslagern. Denn sowohl der Client, als auch der Server brauchen die Klasse.


    ichduersie schrieb:

    wie man mit der DLL kommunizieren können soll
    Ich denke, du solltes die Frage anders formulieren. Nicht wie man mit der DLL kommunizieren kann, sondern eher, was die DLL können soll/muss.

    ichduersie schrieb:

    fertigen Code
    Das wäre dann eher was für den Marktplatz
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator: Ich weiß ja nicht, ob er bereits eine DLL geschrieben hat und weiß, wie sie aufgebaut ist. Daher habe ich mich für diese Wortwahl entschieden, damit eben auch Anfänger und noch nicht so weit fortgeschrittene verstehen, was ich meine.
    Nein, da wir nicht wissen, wie du die DLL aufbauen möchtest. Willst du nur eine Klasse für alles, willst eine Klasse für den Server und eine für Clients, soll das Netzwerkbackend in die Serverklasse oder wieder in eine neue Klasse ausgelagert werden? Das sind alles fragen, die nur du beantworten kannst, da es deine DLL ist ;)
    Ich würde ganz gerne aus diesem Code eine DLL für den Server sowie auch für den Client machen:

    VB.NET-Quellcode

    1. ​Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. ' TCP-MultiServer
    5. ' C 2009 - Vincent Casser
    6. Module Module1
    7. Private server As TcpListener
    8. Private client As New TcpClient
    9. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
    10. Private list As New List(Of Connection)
    11. Private Structure Connection
    12. Dim stream As NetworkStream
    13. Dim streamw As StreamWriter
    14. Dim streamr As StreamReader
    15. Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    16. End Structure
    17. Private Sub SendToAllClients(ByVal s As String)
    18. For Each c As Connection In list ' an alle clients weitersenden.
    19. Try
    20. c.streamw.WriteLine(s)
    21. c.streamw.Flush()
    22. Catch
    23. End Try
    24. Next
    25. End Sub
    26. Sub Main()
    27. Console.WriteLine("Der Server läuft!")
    28. server = New TcpListener(ipendpoint)
    29. server.Start()
    30. While True ' wir warten auf eine neue verbindung...
    31. client = server.AcceptTcpClient
    32. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    33. c.stream = client.GetStream
    34. c.streamr = New StreamReader(c.stream)
    35. c.streamw = New StreamWriter(c.stream)
    36. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    37. list.Add(c) ' und fügen sie der liste der clients hinzu.
    38. Console.WriteLine(c.nick & " has joined.")
    39. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
    40. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    41. t.Start(c)
    42. End While
    43. End Sub
    44. Private Sub ListenToConnection(ByVal con As Connection)
    45. Do
    46. Try
    47. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
    48. Console.WriteLine(con.nick & ": " & tmp)
    49. SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
    50. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    51. list.Remove(con)
    52. Console.WriteLine(con.nick & " has exit.")
    53. Exit Do
    54. End Try
    55. Loop
    56. End Sub
    57. End Module


    VB.NET-Quellcode

    1. ​Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Private stream As NetworkStream
    5. Private streamw As StreamWriter
    6. Private streamr As StreamReader
    7. Private client As New TcpClient
    8. Private t As New Threading.Thread(AddressOf Listen)
    9. Private Delegate Sub DAddItem(ByVal s As String)
    10. Private nick As String = "unknown"
    11. Private Sub AddItem(ByVal s As String)
    12. ListBox1.Items.Add(s)
    13. End Sub
    14. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    15. Try
    16. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
    17. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    18. If client.Connected Then
    19. stream = client.GetStream
    20. streamw = New StreamWriter(stream)
    21. streamr = New StreamReader(stream)
    22. streamw.WriteLine(nick) ' das ist optional.
    23. streamw.Flush()
    24. t.Start()
    25. Else
    26. MessageBox.Show("Verbindung zum Server nicht möglich!")
    27. Application.Exit()
    28. End If
    29. Catch ex As Exception
    30. MessageBox.Show("Verbindung zum Server nicht möglich!")
    31. Application.Exit()
    32. End Try
    33. End Sub
    34. Private Sub Listen()
    35. While client.Connected
    36. Try
    37. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    38. Catch
    39. MessageBox.Show("Verbindung zum Server nicht möglich!")
    40. Application.Exit()
    41. End Try
    42. End While
    43. End Sub
    44. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    45. streamw.WriteLine(TextBox1.Text)
    46. streamw.Flush()
    47. TextBox1.Clear()
    48. End Sub
    49. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    50. nick = InputBox("Nickname: ", "Namen festlegen", "unknown")
    51. End Sub
    52. End Class


    Bei diesem Code weis ich nur nicht ob ich alles nehmen soll/kann oder ob ich etwas weglassen soll/kann.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Gut, hat meine Frage zwar nicht wirklich beantwortet, aber ich kann mir eine Antwort aus dem Code schließen.
    Ich habe mal ein mögliches Klassendiagramm zu dem Code für eine DLL erstellt:


    So könnte die DLL aufgebaut sein. Den ganzen Code zum verbinden solltest du in die Konstruktoren bzw. eine Connect-Methode auslagern. Jetzt musst du nur noch dieses Grundgerüst übernehmen und deinen bereits vorhandenen Code rein kopieren...
    Ich habe mir bereits den Code den ich damals hier rein kopiert habe, nochmals kopiert. Und jetzt weis ich nicht wie ich diesen Code in der DLL verwenden kann/soll sodass auch meine Windows Form in der DLL weis was ich meine. Könnt ihr mir bitte dabei helfen oder mir ein Grundgerüst einer DLL für einen Chat erstellen sowie mir bereitstellen?
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de

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

    Thiemo1991 schrieb:

    Könnt ihr mir bitte dabei helfen oder mir ein Grundgerüst einer DLL für einen Chat erstellen sowie mir bereitstellen?


    Das wuerde darauf hinaus laufen das Jemand dein Programm schreibt. Ich glaube hier hast du bessere Chancen:
    vb-paradise.de/index.php/Board/931-Jobb%C3%B6rse-Marktplatz/
    And i think to myself... what a wonderfuL World!
    Es würde nicht dahin hinaus laufen. Ich brauche nur ein kleines Grundgerüst davon und mehr. nicht wie kann so etwas angehen kann und dann weiß ich wie so etwas vom Code her aussehen muss/kann.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Also ich versuch es mal so simple wie möglich, aber es ist nichts fertiges für dich zum kopieren.
    Ich erläutere dir mal lediglich wie man so eine DLL erstellt und wie du Sie verwendest. Vielleicht ist das ja dein Hauptproblem.

    Du öffnest Visual Studio und startest ein neues Projekt.
    Dort wählst du aus "Class Library" und benennst das Projekt zum Beispiel UltraChat.

    Dann öffnet sich ein Editor für Class1.
    Diese benennst du nun um für den Client meinetwegen ChatClient.

    Dort fügst du nun oben aus dem klassendiagramm die Felder ein:

    VB.NET-Quellcode

    1. Public Class ChatClient
    2. -- öffentliche Member (die dein Program setzten und lesen können muss)
    3. Public Property IPAdr as IPAdress
    4. Public Property UserName as String
    5. -- private member (die brauchst du in deiner Anwendung nicht kennen)
    6. private client as TCPClient
    7. private sw as streamwriter
    8. private sr as streamreader


    Dann fügst du Methoden ein die du brauchst innerhalb der Klasse. Ich mach nur Beispiele:

    VB.NET-Quellcode

    1. Public Sub Connect(ByVal IP as IPAddress, ByVal Port as Integer)
    2. client = new TCPCLIENT ..
    3. client.connect 'usw
    4. End Sub
    5. Public Sub Send()
    6. 'sende iwas
    7. End Sub
    8. End Class


    Hast du das alles fertig dann erstellst du dein Projekt (Build)
    Hierbei wird im Projektverzeichnis eine DLL erstellt
    Beispielhaft hier:
    C:\Projects\ChatClient\ChatClient\bin\Debug\ChatClient.dll

    Dann öffnest du ein neues Windows Form Projekt (Kann in der selben Solution sein wie die Classlibrary.
    Dort klickst du auf Referenzen und hinzufügen und fügst die ChatClient.dll hinzu.

    Jetzt kannst du in deiner Windows Form auf die Klasse zugreifen und sie verwenden:

    VB.NET-Quellcode

    1. Imports UltraChat
    2. ..
    3. Private Sub Form1_Load(sender As Object, e As EventArgs)
    4. dim c as new ChatClient
    5. c.connect(IP,PORT)
    6. End Sub


    Im Forum findest du Beispiele für fertige Clients die hier sicher schon erwähnt wurden.
    Das ist meine Signatur und sie wird wunderbar sein!
    Brauche ich Imports bzw. welche denn? Ich habe diese hier aus dem Code den ich schon mal gepostet habe, genommen.

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net


    Aber ich weiß nicht ob es bei einer DLL überhaupt notwendig ist.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thiemo1991“ ()

    Thiemo1991 schrieb:

    Imports
    Du musst die DLL als Verweis Deinem Projekt hinzufügen. Dann musst Du musst den Hauptnamespace dieser DLL importieren.
    Wenn Du dann scheibst HAUPT_NAMESPACE . (Punkt), wird Dir von der IDE die Liste der in diesem Namespace verfügbaren Objekte aufgelistet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!