Wysyłanie plików (exe,jpg itp)

Wysyłanie plików (exe,jpg itp)
NO
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:14
0

Witam
Od jakiegoś czasu bawię się programowaniem sieciowym. Umiem już wysłać po TCP wiadomości i obsłużyć użytkowników.
Teraz mam tylko pytanie jak można wysyłać pliki. Wpadłem na pomysł wczytywanie pliku (nie ważne jakiego typu) strumieniem i wysyłanie go linijkami. Jest lepszy sposób na to?


true=!false
MI
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 9 lat
0

Hę? jakimi linikjami? Program nie ma żadnych linijek. Przesyłanie pliku polega na wczytaniu np 1Kb do bufora, następnie przesłanie bufora przez TCP na drugą strone i tam doklejenie do poprzednich danych. I następna paczka.

ŁF
Kb? co to za jednostka?
NO
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:14
0

Do tej pory wczytany plik wrzucałem do stringa, bo znam tylko ten sposób.


true=!false
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

otwiersz plik
czytasz binarnie
przesylasz to co wczytales
odbierasz po drugiej stronie
zapisujesz binarnie
masz plik przeslany

NO
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:14
0

Czyli zwykły StreamReader, a czytanie binarne na czym polega? Wujek pokazuje tylko jak czytać pliki binarne.


true=!false
UT
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 12 lat
0

BinaryReader

ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Jak wiesz, program (tak jak wszystko na komputerze) składa się z ciągów zer i jedynek. 8 takich cyfr to bajt. Czytanie/Zapisywanie/Kopiowanie binarne polega na tym, że za pomocą odpowiedniej funkcji zamieniasz plik na np. tablicę byte[] (która, jak sama nazwa wskazuje, potrafi pomieścić maks. 8 zer i jedynek), a następnie stworzenie nowego pliku i skopiowanie tam w tej samej kolejności tej samej tablicy byte[]. W ten sposób otrzymujesz idealną kopię danego pliku (poza np. nazwą, którą wybierasz sam).

W twoim przypadku, program czytający wczytuje tablicę byte[] i przesyła drugiemu programowi, który tworzy nowy plik i zapisuje w nim tablicę byte[]. Jeśli chcesz, możesz to ulepszyć, np. wysyłając najpierw nazwę pliku, dzięki któremu otrzymasz nie tylko plik o identycznym działaniu, ale również tej samej nazwie.


Patryk27
*tak właściwie, 8 takich cyfr/liczb (bitów) to oktet. Bajt natomiast niekoniecznie.
msm
No już go nie minusujcie, uproszczenia uproszczeniami, ale ilu z was pisało na architekturę gdzie bajty nie są 8bitowe? ;].
ShookTea
@Patryk27 ale w TYM przypadku tak. Wymienianie wszystkich przypadków, w których piszę się bajt/oktet zajęłoby ładne kilka stron.
0

http://pl.wikipedia.org/wiki/Bajt
http://pl.wikipedia.org/wiki/Oktet_%28informatyka%29

Jedno i drugie to 8 bitów, tak więc dużej różnicy nie ma

n0name_l
nie wszedzie, nie zawsze.
Patryk27
Cytując angielską Wiki: The byte is a unit of digital information in computing and telecommunications that *most commonly* consists of eight bits.. Jeżeli chcemy być naprawdę pedantyczni, nie możemy założyć, że bajt to 8 bitów, dlatego napisałem "niekoniecznie" :P
NO
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:14
0

Zrobiłem to wysyłanie za pomocą BinaryReader ja polecił Utermiko.
Wrzuciłem plik wczytany za pomocą BinaryReadera (b) do StreamWritera (streamw) - streamw.Write(b)
Po czym wysłałem do drugiego klienta.
Następnie tworzę File stream do którego wpisuje za pomocą BinaryWriter.
Gdzieś popełniłem błąd, tylko nie wiem gdzie.


true=!false
n0name_l
wyslales w odpowiedniej kolejnosci?
NO
Sprawdzałem już to wcześniej. Wszystko jak tak wysyłam dochodzi w dobrej kolejności.
n0name_l
To inne pytanie, czym sie przejawia ow blad, ew. pokaz kod
NO
Nie ma żadnego błędu. Wydaje mi się, że źle sczytuje, ponieważ po stronie drugiego klienta nie tworzy się plik.
n0name_l
Skoro nie tworzy sie plik, to znaczy, ze zle go tworzysz. Jak nie pokazesz kodu to nikt raczej Ci nie powie co masz zle.
NO
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:14
0

Wysyłanie:

Kopiuj
 
StreamWriter streamw = new StreamWriter(nstream);
            BinaryReader b = new BinaryReader(File.Open("c:\\serwer\\testyyy.png", FileMode.Open));
            streamw.Write(b);
            streamw.Flush();
            b.Close();

Odbieranie:

Kopiuj
StreamReader rstream = new StreamReader(nstream);
                String dane = rstream.ReadLine();
                FileStream writeStream;
                writeStream = new FileStream("c:\\serwer\\cxz.png", FileMode.Create);
                BinaryWriter writeBinay = new BinaryWriter(writeStream);
                writeBinay.Write(dane);
                writeBinay.Close();

true=!false
edytowany 1x, ostatnio: Noodle
n0name_l
BinaryWriter writeBinay = new BinaryWriter(File.Open("path", FileMode.Create)); Sproboj moze tak i usun 2 linijki wyzej. Nie znam sie na C#, ale po przykladach na MSDN wnioskuje, ze to tak powinno wygladac.
NO
To co podałeś jest tylko skróconą wersją mojego kodu.
S2
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:17
0

Myślę że coś takiego bardziej by pasowało dla wysyłania i coś analogicznego dla odbierania bo ReadLine() to mi się jakoś nie widzi, Aczkolwiek z pewnością można ładniej.

Kopiuj
  

                 BinaryWriter bw = new BinaryWriter(NetStream);
               
                BinaryReader b = new BinaryReader(File.Open("c:\\serwer\\testyyy.png", FileMode.Open));
                
                int BufPos = 0;
                byte[] bufor = new byte[10];
              
                while (b.PeekChar() != -1)
                {
                      
                        b.Read(bufor, BufPos, 1);
                        if (BufPos == 9)
                        {

                            bw.Write(bufor);
                            bufor = new byte[10];
              
                            BufPos = 0;
                        }
                        else
                        {
                            BufPos++;
                        }
         
                }
                bw.Close();
              

Poza tym nie wiem czy nie będzie brakowało znacznika końca pliku. Na pewno sw.write(b) nie będzie działać ponieważ wysyłasz obiekt jakim jest BinaryReader a nie to co przeczytał.
Pozdrawiam.

edytowany 2x, ostatnio: stanley21

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.