StreamPlay

    • Beta
    • Open Source

    Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von xd-franky-5.

      StreamPlay

      Name:
      StreamPlay

      Beschreibung:
      StreamPlay besteht aus zwei Teilen. Ein Teil liegt auf dem Computer und der andere als App auf dem Anroid-Gerät. Mit AirPlay ist es möglich, auf dem Computer gespeicherte Musik auf dem Smartphone abzuspielen und zu speichern.

      Screenshot(s):

      Computer:





      Smartphone:




      Source Code:
      Damit jeder den Code zu verwenden kann, wie er will und der gesamte Code etwas unübersichtlich wäre, kommt hier jetzt nur der erwähnenswerte Teil:

      PC:

      Hier die Klasse für den TCP-Server, der auf die Vorlage von diesem hier beruht: Multiserver (TCP)
      TCP-Server

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. Public Class TCPServer
      5. Private server As TcpListener
      6. Private client As New TcpClient
      7. Private ipendpoint As IPEndPoint
      8. Private list As New List(Of Connection)
      9. Private Structure Connection
      10. Dim stream As NetworkStream
      11. Dim streamw As StreamWriter
      12. Dim streamr As StreamReader
      13. Dim nick As String
      14. End Structure
      15. Dim _caller As Form
      16. Event ClientConnected(Name As String)
      17. Event ClientDisconnected(Name As String)
      18. Event MessageRecieved(Text As String)
      19. Public Sub New(caller As Form, port As Integer)
      20. ipendpoint = New IPEndPoint(IPAddress.Any, port)
      21. _caller = caller
      22. End Sub
      23. Private Delegate Sub DAddItem(ByVal s As String)
      24. Private Delegate Sub DDelItem(ByVal s As String)
      25. Private Delegate Sub DNewMsg(ByVal t As String)
      26. Private Sub AddItem(ByVal s As String)
      27. RaiseEvent ClientConnected(s)
      28. End Sub
      29. Private Sub DelItem(ByVal s As String)
      30. RaiseEvent ClientDisconnected(s)
      31. End Sub
      32. Private Sub NewMsg(t As String)
      33. RaiseEvent MessageRecieved(t)
      34. End Sub
      35. Public Sub SendFile(ByVal Path As String)
      36. Try
      37. For Each c As Connection In list
      38. Dim fstm As Stream = New FileStream(Path, FileMode.Open, FileAccess.Read)
      39. Dim buffer(1023) As Byte
      40. Do
      41. Dim bytesRead As Integer = fstm.Read(buffer, 0, buffer.Length)
      42. If bytesRead = 0 Then Exit Do
      43. c.stream.Write(buffer, 0, bytesRead)
      44. c.stream.Flush()
      45. Loop
      46. fstm.Close()
      47. Next
      48. Catch ex As Exception
      49. End Try
      50. End Sub
      51. Public Sub SendText(ByVal Text As String)
      52. Try
      53. For Each c As Connection In list
      54. c.streamw.WriteLine(Text)
      55. c.streamw.Flush()
      56. Next
      57. Catch ex As Exception
      58. End Try
      59. End Sub
      60. Private Sub Starter()
      61. server = New TcpListener(ipendpoint)
      62. server.Start()
      63. While True
      64. client = server.AcceptTcpClient
      65. Dim c As New Connection
      66. c.stream = client.GetStream
      67. c.streamr = New StreamReader(c.stream)
      68. c.streamw = New StreamWriter(c.stream)
      69. c.nick = c.streamr.ReadLine
      70. If Not c.nick = "" Then
      71. list.Add(c)
      72. _caller.Invoke(New DAddItem(AddressOf AddItem), c.nick)
      73. Dim t As New Threading.Thread(AddressOf ListenToConnection) With {.IsBackground = True}
      74. t.Start(c)
      75. End If
      76. End While
      77. End Sub
      78. Public ReadOnly Property Clients As List(Of String)
      79. Get
      80. Dim names As New List(Of String)
      81. For Each c As Connection In list
      82. names.Add(c.nick)
      83. Next
      84. Return names
      85. End Get
      86. End Property
      87. Public Sub Start()
      88. Dim t As New Threading.Thread(AddressOf Starter) With {.IsBackground = True}
      89. t.Start()
      90. End Sub
      91. Private Sub ListenToConnection(ByVal con As Connection)
      92. Do
      93. Try
      94. Dim tmp As String = con.streamr.ReadLine
      95. If Not String.IsNullOrEmpty(tmp) Then
      96. _caller.Invoke(New DNewMsg(AddressOf NewMsg), tmp)
      97. Else
      98. _caller.Invoke(New DDelItem(AddressOf DelItem), con.nick)
      99. list.Remove(con)
      100. Exit Do
      101. End If
      102. Catch ex As Exception
      103. End Try
      104. Loop
      105. End Sub
      106. End Class



      Der Server wird dann so gestartet und eine liste der Titel erstellt:

      Server starten

      VB.NET-Quellcode

      1. WithEvents TcpServer As New TCPServer(Me, My.Settings.Port)
      2. For Each file In System.IO.Directory.GetFiles(My.Settings.Path)
      3. Dim fileinfo As New FileInfo(file)
      4. If Not fileinfo.Attributes.ToString.Contains("Hidden") And Not fileinfo.Attributes.ToString.Contains("System") Then
      5. If file.EndsWith(".mp3") Then
      6. tcpfiles.Add("song:" & System.IO.Path.GetFileNameWithoutExtension(file) & "*" & System.IO.File.ReadAllBytes(file).Length)
      7. End If
      8. End If
      9. Next
      10. TcpServer.Start()



      Wenn das Smartphone connected, sendet das Programm eine Liste aller Titel
      Verbinden

      VB.NET-Quellcode

      1. Public Sub Client_Connected(Name As String) Handles TcpServer.ClientConnected
      2. Dim t As New Threading.Thread(AddressOf sendlist) With {.IsBackground = True}
      3. t.Start()
      4. DevicesList.Items.Add(Name)
      5. End Sub
      6. Public Sub sendlist()
      7. For Each File In tcpfiles
      8. TcpServer.SendText(File)
      9. Threading.Thread.Sleep(10)
      10. Next
      11. End Sub



      Smartphone:
      Wenn sich das Handy verbindet, sendet der TCP Server eine Liste aller Dateien.
      So sieht die Verbindung mittels eines TCP-Clients bei B4A aus:
      TCP-Client

      VB.NET-Quellcode

      1. Sub Process_Globals
      2. Dim AStreams As AsyncStreams
      3. Dim Socket1 As Socket
      4. End Sub
      5. Sub Activity_Create(FirstTime As Boolean)
      6. Socket1.Initialize("Socket1")
      7. Socket1.Connect(ip,port,1000)
      8. End Sub
      9. Sub Socket1_Connected(Successful As Boolean)
      10. If Successful = True Then
      11. AStreams.Initialize(Socket1.InputStream,Socket1.OutputStream,"Astreams")
      12. Dim p As Phone
      13. Dim name As String
      14. name = p.Model & CRLF
      15. Dim buffer() As Byte
      16. buffer=name.GetBytes("UTF8")
      17. AStreams.Write(buffer)
      18. Else
      19. Activity.Finish
      20. StartActivity(Retry)
      21. Socket1.Close
      22. End If
      23. End Sub



      Hier können nun Musik-Titel, Kommandos und Dateien empfangen werden:
      Zu beachten: Die Titel werden samt Bytelength gesendet, damit man nachher weiß, wann die Datei fertig angekommen ist
      Bytes empfangen

      VB.NET-Quellcode

      1. Sub AStreams_NewData (Buffer() As Byte)
      2. Dim msg As String
      3. msg = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
      4. Dim text As String = msg.SubString2(0, msg.Length-2)
      5. If text.StartsWith("song:") Then
      6. 'Titel in die Liste
      7. Else if text.StartsWith("pause:") Then
      8. 'pause
      9. Else 'Also wenn es kein Kommando gibt, dann sind es die Bytes einer Datei
      10. Dim out As OutputStream
      11. out = File.OpenOutput(File.DirRootExternal, "StreamPlay/Data/" & SongsLv.GetItem(selsong) & ".mp3", True) 'das true bedeutet, dass die neuen Bytes an die vorherigen Bytes an die Datei hinten hin geschrieben werden, bis sie ganz ist(die Dateigröße mit der vorher gesendeten Length übereinstimmt)
      12. out.WriteBytes(Buffer, 0, Buffer.length)
      13. out.Close
      14. If File.Size(File.DirRootExternal, "Test.mp3") = songlength Then
      15. 'Datei fertig geladen
      16. End If
      17. End If
      18. End Sub



      Das waren nun so die grundlegenden Sachen mit denen ihr nun so weiterarbeiten könnt, wie ihr wollt. Viel Spaß :)

      ToDo:
      -Delay entfernen
      -Pause ✓
      -Design ändern ✓
      -Umbenennen ✓
      -Ohne HTTP-Server ✓
      -Code vereinfacht und verschönert ✓

      Verwendete Programmiersprache(n) und IDE(s):
      Visual Basic .NET / IDE VB 2013 Comunity / Basic 4 Android

      Systemanforderungen:
      Framework 4.0

      Download(s):
      Programm: StreamPlay.rar ~143 kb
      App: StreamPlay App.rar ~305 kb

      Lizenz/Weitergabe:
      Freeware, OpenSource

      Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „xd-franky-5“ ()

      Ich finde die Lösung mit dem Http Server lustig und zu gleich auch wtf... Könntest du nicht versuchen mit Vincent zusammen zu arbeiten? Er hat einen existierenden guten Player und du die Extension dafür.

      Wenn du die gesendeten Daten in deinem bytearray reversed wär dein little E und big E Problem gelöst.
      Lustiger weise war dieses Programm für Vincent gedacht, er meinte bei der nächsten Version von Hurricane könnte er es einbauen. Das dauert aber noch ein bisschen, deshalb hab' ichs einfach mal hier schon präsentiert, um es bis dahin noch zu verbessern.
      Ich will auch mal meinen Senf dazu geben: Also auf jeden Fall mal ein interessanter Ansatz. Scheinst das gut umgesetzt zu haben :D Leider konnte ich das nicht richtig testen, da das abspielen irgendwie nicht funktionierte, da ich immer disconnects bekam. Aber schön, dass du deine Arbeit allen zur Verfügung stellst :)

      LG

      P.S.: Warum wird in dem Programm eigentlich eine andere IP-Adresse angezeigt als die, mit der mein PC mitm Router verbunden is? Im Programm steht 192.168.56.1 und eig isses .2.108 :huh:
      @ThuCommix Es geht nicht nur um Little und Big Endian sondern auch um eine komische Präfix, da muss man ganz verrückte Dinge machen. Zumindest gibt es nich keine Lösung zum Senden und Empfangen von Dateien bei B4A im Internet.

      @ChOoSeMyNaMe
      Danke :) Wie disconnects ? Erkläre das bitte genauer. Das mit der IP ist mir auch noch ein Rätsel bei mir kommt manchmal die richtige und manchmal auch etwas anderes. Mal schauen, wie ich das löse :)
      Keine Ahnung wie dein TCP Code aussah, aber irgendwas hast du falsch gemacht. Eine TCP kommunikation von C# und Android ist kein Hexenwerk. Wenn du einen anderen Endian hast und in einen String umwandelst bekommste natütlich merkwürdige prefixe.

      xd-franky-5 schrieb:

      Erkläre das bitte genauer.

      Also ich starte des Programm, dann die App und connecte dann. Dann wird die Verbindung hergestellt und ich seh sowohl in der App als auch im Programm die beiden Geräte. Wenn ich dann versuche was abzuspielen, dann kommt in der App "Connection failed!". Wenn man dann auf Retry drückt wird die Verbindung erneut hergestellt allerdings sieht man nur in der App beide Geräte und das Programm hängt sich auf.

      LG
      @ThuCommix
      Wenn du mir einen Link findest, mit einer Vorlage findest, dann her damit. Das war halt so, als ich einen Base64 string gesendet habe, kamen beim Android nur viele kleine Stückchen an. Und von Android zu PC muss es ja nicht einmal gehen.

      @ChOoSeMyNaMe Hast du den Port freigeschalten, die richtige IP und Port angegeben ? Bei mit klappt es.
      Weil es mit Sockets und dem "normalem" Senden von Dateien erst recht nicht funktioniert hat und ich nicht mal wusste warum.

      EDIT: Es war doch so: Mit dem Base64 string kamen nur Stückchen an und mit dem normalen Senden war das Problem, das die Datei nicht die richtige Prefix hatte.
      LOL. Ich Habe bestimmte ne Woche daran herumgewurstelt und im Internet wusste auch keiner so richtig damit umzugehen (habe sogar einen Thread beim Entwickler gemacht und der Entwickler konnte mir sogar nicht helfen) und jetzt habe ich es in 5 Minuten geschafft :) Ohne Prefix (habe den Prefix-Mode einfach gar nicht erst angeschalten). Big/Little Endian-Problem war aufeinmal auch nicht mehr da. Ich habe einfach die Datei so gesendet:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Sub SendFile(ByVal Path As String)
      2. Try
      3. For Each c As Connection In list
      4. Dim nstm As Stream = c.stream
      5. Dim fstm As Stream = New FileStream(Path, FileMode.Open, FileAccess.Read)
      6. Dim buffer(1024 - 1) As Byte
      7. Do While True
      8. Dim bytesRead As Integer = fstm.Read(buffer, 0, buffer.Length)
      9. If bytesRead = 0 Then Exit Do
      10. nstm.Write(buffer, 0, bytesRead)
      11. nstm.Flush()
      12. Loop
      13. nstm.Close()
      14. fstm.Close()
      15. Next
      16. Catch ex As Exception
      17. End Try
      18. End Sub


      Und beim Empfangen es so eingestellt, dass es die Bytes bei der Datei hinten dran schreibt. Vielleicht mach ich es noch so, dass es die Bytes in einem Array speichert und dann zum Schluss erst niederschreibt, mal sehen :)

      EDIT: Werde dann beim nächsten Update den HTTP-Server rausnehmen.
      EDIT2: Ich weiß garnicht warum das noch keinem aufgefallen ist (mir ist es auch erst jetzt aufgefallen) überall in der App steht "Hurricane" weil es ja eigentlich dafür war :D

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „xd-franky-5“ ()

      Mal abgesehen davon, dass es Präfix heißt (sry musste sein),

      finde ich die Idee sowie die Umsetzung super. Habe mir den Code nicht näher angesehen, aber ich freue mich schon auf die Implementierung in Hurricane !
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
      @ThePlexian
      Bei B4A heißt es Prefix, auf deutsch Präfix. Ich denke bei sowas sollte man den englischen Ausdruck verwenden :)
      Danke, hab' es jetzt aber anders umgesetzt, das Update ohne HTTP-Server kommt nachher.

      Ich wollte es ja umbenennen, habt ihr mir einen passenden Namen ?

      @ChOoSeMyNaMe
      Btw. diese Box unten links mit "Computer" und "[Gerätename]" bedeutet nicht nur mit was man verbunden ist, hauptsächlich ist das zum auswählen der Soundausgabe gedacht. Also ob der Sound am Computer oder Smartphone raus kommen soll.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xd-franky-5“ ()

      Habe nun folgendes erledigt:
      -Pause
      -Design ändern
      -Umbenennen
      -Ohne HTTP-Server
      -Code vereinfacht und verschönert

      Programm: StreamPlay.rar ~305 kb
      App: StreamPlay App.rar ~143 kb

      Habt ihr noch Verbesserungswünsche ? :thumbsup: