Posílání souborů   otázka

VB.NET

Krásný den

Jelikož nemám příliš zkušeností s VB .NET

Mám takový záludný problém, chtěl bych se zeptat, jakým způsobem se dá zprovoznit posílání souborů přes síť.

Jestliže mám vytvořený chat i spojení díky tomuto článku

http://www.vbnet.cz/clanek--27-kreslici_...

nejprve jsem zkoušel něco najít a zjistit jakým způsobem se to dá vůbec řešit, přišel jsem akorát na posílání souborů .txt (neboli převedení souboru na text a dekódování nazpět) ale samozřejmě jsem hned zjistil, že obrázky a jiné to nepůjde, proto hledám jiný a asi jasný způsob.

děkuji moc za každou radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na tak obecný dotaz se nedá odpovědět. Záleží na tom, jakým způsobem je komunikace udělaná (lze to udělat desítkami způsobů), ale každopádně je jedno jestli posíláte text, soubor, nebo jakákoliv jiná data, vždy je to jen pole bajtů, které je potřeba poslat z bodu A do bodu B.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mno já právě nevím jak sepsat nějaký příkaz na odesílání souborů v "binary" bajtech,

Jestli je možné, klidně pošlu na email co jsem vytvořil (je to celkem dlouhé abych to vložil sem), aby to bylo konkrétní a jasné

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud je to obyčejná základní TCP komunikace pomocí socketů tak u TcpClienta se metodou GetStream získá stream a s ním se pak zapisuje a čte (odesílá a přijímá) stejně jako se souborovým streamem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano je to obyčejná TCP komunikace

ano toto mám pro chat jako posílání zpráv (textu)

Dim text_buffer As String  

networkStream = tcp.GetStream()
networkStream.BeginRead(Buffer, 0, BUFFER_SIZE, AddressOf CtiData, Nothing)

'cteni dat
 Dim prijato As Integer = networkStream.EndRead(at)
 If prijato < 1 Then Throw New Exception() 
 text_buffer += System.Text.Encoding.ASCII.GetString(Buffer, 0, prijato)
 RichTextBox1.AppendText(text_buffer + vbCrLf) 'pridani textu do RichTextu
 text_buffer = ""
 tcp.GetStream.BeginRead(Buffer, 0, BUFFER_SIZE, AddressOf CtiData, Nothing)

'odeslani zprav
 Dim message_text As String
 message_text = message.Text
 Dim bfr(message_text.Length - 1) As Byte
 bfr = System.Text.Encoding.ASCII.GetBytes(message_text)
 networkStream.Write(bfr, 0, bfr.Length)
 RichTextBox1.AppendText(message_text & vbCrLf)
 message.Text = ""

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi tak, že najprv strana A pošle napríklad "SendFile".

Strana B pošle "Ready" a riadok s BeginRead vynechajte.

Strana A pošle dĺžku súboru v bajtoch, ako Integer.

Taktiež samotný súbor natlačte do NetworkStream cez BeginWrite alebo cez Write.

Strana B naalokuje pole danej veľkosti.

Príjme dáta cez stream.BeginRead s uvedením potrebného počtu bajtov.

V callbacku(to s tým EndRead) nahrajete dáta do poľa, uložíte do súboru a potom to BeginRead, ktoré ste na začiatku prenosu vynechal.

Na prenos súborov s veľkosťou 1 MB a viac použite FileStream a prenášajte po jednotlivých MB.Pre menšie zaťaženie RAM(operačná pamäť).

Taktiež na riadku č. 2 voláte tcp.GetStream() a ukládate do premennej.Aký ma potom význam na riadku č. 10 znovu volať GetStream() ? Použite premennú networkStream, tak ako na riadku č. 15 .

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mohu se zeptat zda jdu správným směrem?

Const BUFFER_FILE As Integer = 12000
Dim Buffer_f(BUFFER_FILE) As Byte


Čti soubor:
Dim fs As New FileStream("data", FileMode.Create, FileAccess.Write)
            fs.Write(Buffer_f, 0, prijato)
            fs.Close()
     RichTextBox1.AppendText("Prijat soubor o velikosti : " & prijato + vbCrLf)
            tcp.GetStream.BeginRead(Buffer, 0, BUFFER_SIZE, AddressOf CtiData, Nothing) 

poslat soubor:
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then

Dim send_file As String = vbCrLf & vbCrLf & "send_file" & vbCrLf & vbCrLf

Dim bfr(send_file.Length - 1) As Byte
bfr = System.Text.Encoding.ASCII.GetBytes(send_file)
networkStream.Write(bfr, 0, bfr.Length)
         
Dim fs = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
Dim size As Integer = fs.Length

tcp.GetStream.BeginRead(Buffer_f, 0, BUFFER_FILE, AddressOf CtiSoubor, Nothing)

jak říkám nejsem nějaký odborník, mám v mnoha ještě zmatek

děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro obecná data zásadně nepoužívat System.Text.Encoding.ASCII.GetBytes, to je určeno pro převod textových řetězců (System.Text.Encoding.ASCII).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mohu se tedy zeptat jaký příkaz se pro obecné data používá?

hledal jsem něco a jediné co jsem našel je něco jako streamování podle velikosti bytu, něco jako je toto:

        Dim networkStream As NetworkStream = tcpClient.GetStream()

        Dim datalength As Integer = 0
        Dim lengthbytes(4) As Byte
        Dim g As BitConverter

        'read the size of the data
        networkStream.Read(lengthbytes, 0, 4)
        datalength = g.ToInt32(lengthbytes, 0)

        Dim bytes(datalength) As Byte

        Try

            '    'wait for DATA 
            networkStream.Read(bytes, 0, datalength)


nahlásit spamnahlásit spam 0 odpovědětodpovědět

Obecně se pracuje s polem bajtů a jak to pole bajtů získáte záleží na těch datech. Pro soubory samozřejmě nebudete používat Encoding.GetBytes, který je určen pro textové řetězce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nešlo by pro čtení bytů použít IO.File.ReadAllBytes("...")?

Myslím že to je logické... Pokud ne tak se omluvám a opravte mě prosím.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Neustále to zkouším a bohužel si s tím nevím rady, možná jsou vaše rady přínosem, ale jelikož jsem asi totální začátečník, tak mi většinou pomůže nějaký příkaz než slova, jelikož mnoho příkazů neznám.

Zajímalo by mě jakým způsobem mám poslat soubor aby se nepřekodoval na text, to jsem neustále nepochopil čím toho dosáhnu.. poté bych tedy ty data přečetl tím jak jste napsal vy IO.File.ReadAllBytes

děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud máš na odesílání toto:

'odeslani zprav
 Dim message_text As String
 message_text = message.Text
 Dim bfr(message_text.Length - 1) As Byte
 bfr = System.Text.Encoding.ASCII.GetBytes(message_text)
 networkStream.Write(bfr, 0, bfr.Length)
 RichTextBox1.AppendText(message_text & vbCrLf)
 message.Text = ""

tak bych tu funkci použil takto:

'odeslani zprav
 Dim cesta As String
 cesta = message.Text
 Dim bfr() As Byte
 bfr = IO.File.ReadAllBytes(cesta)
 networkStream.Write(bfr, 0, bfr.Length)
 message.Clear()

a přijímání:

'cteni dat
 Dim prijato As Integer = networkStream.EndRead(at)
 If prijato < 1 Then Throw New Exception() 
 IO.File.WriteAllBytes(InputBox("Cesta pro uložení?"), Buffer)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

zkouším to předělat z toho posílání zpráv na soubory, ale nějak jsem si to upe pokazil, jelikož mi to hází nějaký error.

tady je muj přepracovaný kod, jestli se v to vyznáte tak budu rád za připomínku

Sub CtiSoubor(ByVal at As System.IAsyncResult)
        Try
            'cteni dat
            Dim prijato As Integer = networkStream.EndRead(at)
            If prijato < 1 Then Throw New Exception()
            IO.File.WriteAllBytes(InputBox("c:"), Buffer)

            tcp.GetStream.BeginRead(Buffer, 0, BUFFER_SIZE, AddressOf CtiData, Nothing)       ' přečetli jsme všechny příchozí data, proto budeme čekat až přijdou další
        Catch e As ObjectDisposedException
            ' proběhlo zrušení spojení
        Catch e As Exception
            ' nastala chyba, spojení je ukončeno
            StripInfo.Text = "Spojení bylo ukončeno" ' informace pro uživatele
            MsgBox("Spojení ukončeno!", MsgBoxStyle.Information)
        End Try
    End Sub

    Sub CtiData(ByVal at As System.IAsyncResult)
        Try
            'cteni dat
            Dim prijato As Integer = networkStream.EndRead(at)  ' dokončíme čtení dat a zjistíme kolik dat přišlo
            If prijato < 1 Then Throw New Exception() ' spojení bylo ukončeno (přichází 0B dat)

            text_buffer += System.Text.Encoding.ASCII.GetString(Buffer, 0, prijato) 'prijeti dat

            If text_buffer = message.Text Then
                'MsgBox("prisel soubor")
                text_buffer = ""
                tcp.GetStream.BeginRead(Buffer_f, 0, BUFFER_FILE, AddressOf CtiSoubor, Nothing)
            Else

                RichTextBox1.SelectionColor = Color.Green 'graficka uprava
                RichTextBox1.AppendText(text_buffer + vbCrLf) 'pridani textu do RichTextu
                text_buffer = ""

                tcp.GetStream.BeginRead(Buffer, 0, BUFFER_SIZE, AddressOf CtiData, Nothing)       ' přečetli jsme všechny příchozí data, proto budeme čekat až přijdou další
            End If
        Catch e As ObjectDisposedException
            ' proběhlo zrušení spojení
        Catch e As Exception
            ' nastala chyba, spojení je ukončeno
            StripInfo.Text = "Spojení bylo ukončeno" ' informace pro uživatele
            MsgBox("Spojení ukončeno!", MsgBoxStyle.Information)
        End Try
    End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then


            Dim send_file As String
            send_file = message.Text

            Dim bfr(send_file.Length - 1) As Byte
            bfr = IO.File.ReadAllBytes(send_file) 'prevedeni textu na byte
            networkStream.Write(bfr, 0, bfr.Length) 'odeslani dat pomoci streamu

            message.Clear()

            Dim fs = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
            Dim size As Integer = fs.Length
            Dim ImageData(size - 1) As Byte

            fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length))



            Dim Connected As Boolean = False
            If Not tcp Is Nothing Then
                If Not tcp.Client Is Nothing Then
                    Connected = tcp.Connected
                End If
            End If
            If Connected = False Then Exit Sub ' pokud nejsme ještě připojeni, tak se nic neposíla
            Try
                networkStream.Write(ImageData, 0, ImageData.Length) 'odeslani dat pomoci streamu
                RichTextBox1.SelectionColor = Color.Red 'graficka uprava
                RichTextBox1.AppendText("Posilame soubor: " & OpenFileDialog1.FileName & vbCrLf) 'pridani textu do RichTextu
            Catch ex As Exception
                StripInfo.Text = "Spojení bylo ukončeno"    ' informace pro uživatele
                tcp.Close()                                 ' chyba - uzavřít spojení
                MsgBox("Spojení ukončeno!", MsgBoxStyle.Information)
                End Try
        End If
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

A co přesně to píše za chybu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady je ta chyba, omlouvám se za zobrazení ale lépe to nešlo naformátovat aby to šlo vidět.

Unhandled exception has occurred in your application.

Empty path name is not legal.

***** Exception Text

System.ArgumentException: Empty path name is not legal.

at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)

at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)

at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)

at System.IO.File.ReadAllBytes(String path)

at NetBoard.Form1.Button2_Click(Object sender, EventArgs e) in C:\posilani\Form1.vb:line 187

at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)

at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

at System.Windows.Forms.Control.WndProc(Message& m)

at System.Windows.Forms.ButtonBase.WndProc(Message& m)

at System.Windows.Forms.Button.WndProc(Message& m)

at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co není jasné na této vyjímce? Empty path name is not legal - Prázdná cesta není platná.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mno jelikož jsem to tam nenapsal tak asi něco na tom bude..

Poradíte prosím?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kód co jsem vám napsal počítá s tím že v TextBoxu (či co to je) který se jmenuje "message" bude cesta! Když už něco používáte, tak se na to alespoň podívejte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano děkuji, moc se omlouvám, nějak jsem to popletl.

Už jsem to opravil a upravil, nyní odešlu soubor, ale pořád se mi koduje do textu, tudiž jsem prakticky úplně na začátku,

někde v tom přenosu musím mít špatný příkaz nebo nevím

nevím jak lze provést aby se to uložilo do soubor

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback