Winsoket Dateien versenden

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von fixi93.

    StreamWriter und StreamReader, bist du dir sicher, dass du vom selben redest wie ich denke?
    WinSocket erinnert mich an VB 6 und die WinSock.dll(.ocx?!)

    Oder meinst du die .Net Sockets...

    Bei beiden Arten vom Prinzip her auf dieselbe weiße, du benötigst eine Art Protokoll, mit welcher du Anfang und Ende der Datei feststellst und Namen usw...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hi

    Ich habe schon mit hilfe eines Tutorial von hier nen Chat hinbekommen und da möchte ich jetzt noch Dateien versenden.

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Xml 'XML Importieren
    4. Public Class Form1
    5. Public stream As NetworkStream
    6. Public streamw As StreamWriter
    7. Public streamr As StreamReader
    8. Public client As New TcpClient
    9. Private t As New Threading.Thread(AddressOf Listen)
    10. Private Delegate Sub DAddItem(ByVal s As String)
    11. Private nick As String = "unknown"
    12. Private server As String = "0.0.0.0"
    13. Public ActiveConnection As Boolean = True
    14. Public list As New List(Of forms) 'Liste für einzelchats
    15. Public Structure forms 'Datentyp erstellen um forms für einzelchat zu identifizieren
    16. Dim x As Form2
    17. Dim y As String
    18. End Structure
    19. Private Sub AddItem(ByVal s As String)
    20. Dim xml As New XmlDocument
    21. Dim y As String = ""
    22. xml.LoadXml(s) 'String in xml wandeln
    23. Dim funk As XmlNodeList = xml.GetElementsByTagName("funk") 'nach headerteil für funktion suchen
    24. For Each funks As XmlNode In funk
    25. y = funks.InnerText.ToString 'ausgabe des Headerteils
    26. Next
    27. If y = "new" Then 'welcher headerteil?
    28. Dim w As String
    29. Dim v As String
    30. Dim body As XmlNodeList = xml.GetElementsByTagName("body") 'body auslesen
    31. For Each bodys As XmlNode In body
    32. w = bodys.InnerText.ToString
    33. v = "Benutzer " & w & " hat sich angemeldet." 'Nachricht zusammenfassen
    34. ListBox1.Items.Add(v) 'ausgabe
    35. ListBox2.Items.Add(w)
    36. Next
    37. ElseIf y = "mess" Then 'welcher headerteil?
    38. Dim w As String = ""
    39. Dim v As String = ""
    40. Dim z As String
    41. Dim body As XmlNodeList = xml.GetElementsByTagName("body") 'body auslesen
    42. For Each bodys As XmlNode In body
    43. w = bodys.InnerText.ToString
    44. Next
    45. Dim sender As XmlNodeList = xml.GetElementsByTagName("sender") 'sender auslesen
    46. For Each senders As XmlNode In sender
    47. v = senders.InnerText.ToString
    48. Next
    49. z = "User " & v & " sendet " & w 'nachricht zusammenfassen
    50. For Each test In list
    51. If test.y = "X" Then
    52. test.x.ListBox1.Items.Add(z)
    53. End If
    54. Next
    55. If Form2.Tag = "X" Then
    56. Form2.ListBox1.Items.Add(z)
    57. End If
    58. ListBox1.Items.Add(z) 'ausgabe
    59. ElseIf y = "exit" Then 'User die Verlassen haben
    60. Dim w As String = ""
    61. Dim body As XmlNodeList = xml.GetElementsByTagName("body") 'body auslesen
    62. For Each bodys As XmlNode In body
    63. w = bodys.InnerText.ToString
    64. Next
    65. ListBox2.Items.Remove(w)
    66. ElseIf y = "bestus" Then 'Bestehende user
    67. Dim w As String = ""
    68. Dim body As XmlNodeList = xml.GetElementsByTagName("body") 'body auslesen
    69. For Each bodys As XmlNode In body
    70. w = bodys.InnerText.ToString
    71. Next
    72. If w = nick Then 'auf eigenen Name prüfen
    73. Else
    74. ListBox2.Items.Add(w)
    75. End If
    76. Else
    77. End If
    78. End Sub
    79. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    80. CloseConnection()
    81. End Sub
    82. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    83. Try
    84. client.Connect(server, 8000) ' hier die ip des servers eintragen. server verbinden
    85. If client.Connected Then 'Wenn verbindung besteht
    86. stream = client.GetStream 'Stream öffnen
    87. streamw = New StreamWriter(stream)
    88. streamr = New StreamReader(stream)
    89. Dim x As String
    90. x = CreateMessage(nick, "Server", "Hallo", "room")
    91. streamw.WriteLine(x) ' das ist optional. nachricht erstellen
    92. streamw.Flush() 'nachricht versenden
    93. t.Start() 'Thread starten
    94. Else
    95. MessageBox.Show("Verbindung zum Server nicht möglich!") 'Fehlerfall
    96. Application.Exit()
    97. End If
    98. Catch ex As Exception
    99. MessageBox.Show("Verbindung zum Server nicht möglich!") 'Unerwareter fehler
    100. Application.Exit()
    101. End Try
    102. End Sub
    103. Private Sub Listen()
    104. While client.Connected And ActiveConnection 'Verbindung abhören
    105. Try
    106. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine) 'eingehende nachrichten verarbeiten
    107. Catch 'Fehler oder abschluss
    108. If ActiveConnection Then ' Abfrage
    109. MessageBox.Show("Keine Verbindung zum Server." & vbNewLine & "Das Programm wird nun beendet.")
    110. Application.Exit()
    111. End If
    112. CloseConnection()
    113. End Try
    114. End While
    115. End Sub
    116. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    117. nick = InputBox("Nickname: ", "Namen festlegen", "unknown")
    118. server = InputBox("Serveradresse?")
    119. End Sub
    120. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    121. Dim x As String
    122. x = CreateMessage(nick, "Test", TextBox1.Text, "mess")
    123. streamw.WriteLine(x) 'Nachricht erstellen
    124. streamw.Flush() 'Nachricht versenden
    125. TextBox1.Clear()
    126. End Sub
    127. Private Sub CloseConnection()
    128. ActiveConnection = False
    129. streamw.Close()
    130. streamr.Close()
    131. stream.Close()
    132. client.Close()
    133. End Sub
    134. Private Function CreateMessage(ByVal Source As String, _
    135. ByVal Destinations As String, _
    136. ByVal Content As String, ByVal funk As String) As String
    137. Dim XmlDoc As New XmlDocument
    138. Dim MessageNode As XmlNode = XmlDoc.CreateElement("message")
    139. XmlDoc.AppendChild(MessageNode)
    140. Dim HeaderNode As XmlNode = XmlDoc.CreateElement("header")
    141. MessageNode.AppendChild(HeaderNode)
    142. Dim SenderNode As XmlNode = XmlDoc.CreateElement("sender")
    143. SenderNode.InnerText = Source
    144. HeaderNode.AppendChild(SenderNode)
    145. Dim FunkNode As XmlNode = XmlDoc.CreateElement("funk")
    146. FunkNode.InnerText = funk
    147. HeaderNode.AppendChild(FunkNode)
    148. Dim ReceiverNode As XmlNode = XmlDoc.CreateElement("receiver")
    149. ReceiverNode.InnerText = Destinations
    150. HeaderNode.AppendChild(ReceiverNode)
    151. Dim BodyNode As XmlNode = XmlDoc.CreateElement("body")
    152. BodyNode.InnerText = Content
    153. MessageNode.AppendChild(BodyNode)
    154. Return XmlDoc.OuterXml
    155. End Function
    156. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    157. Dim x As New forms 'neuen eintrag erstellen
    158. x.x = New Form2 'neue Form erstellen
    159. x.y = "X" 'Zusatz setzen
    160. list.Add(x) 'Eintrag in liste schreiben
    161. x.x.Show() 'form anzeigen
    162. End Sub
    163. End Class
    Ich weiss, das meine Methode nicht die beste ist, aber ich sags trotzdem mal (weil's funzt!):

    VB.NET-Quellcode

    1. Sub filesend()
    2. If Not TextBox4.Text = Nothing Or TextBox5.Text = Nothing Or Not ListBox1.Items.Contains(TextBox5.Text) = Nothing Then
    3. Dim finfo As New FileInfo(TextBox4.Text)
    4. Dim buffer() As Byte = File.ReadAllBytes(TextBox4.Text)
    5. streamw.WriteLine("/file " & TextBox5.Text & "|" & TextBox3.Text & "|" + finfo.Name & "|" + Convert.ToBase64String(buffer))
    6. Me.Height = 246
    7. RichTextBox1.Text = RichTextBox1.Text & "Datei " & finfo.Name & " (" & finfo.Length.ToString & ") wurde an " & TextBox5.Text & " gesendet!"
    8. TextBox5.Clear()
    9. TextBox4.Clear()
    10. Label6.Text = "FileInfo"
    11. Label7.Text = "FileInfo"
    12. Label8.Text = "FileInfo"
    13. streamw.WriteLine("Datei wird gesendet...")
    14. End If ' + ";" + finfo.Length.ToString + ";" + finfo.Extension
    15. End Sub

    Also wird bei einem abc.txt mit 3kb das gesendet: /file Empfänger|Sender|abc.txt|und hier bytes

    Das kann ich so beim empfänger gut splitten.

    mfg

    gfc