Ĺadny brzuch
Piszę taki program opraty na protokole TCP. Jest taka opcja, że wysyłam z klienta do serwa pakiet, ktory ma spowodowac u serwera pobranie i wyslanie screena a u klienta odbior i zapis do pliku. To jest moim problem - przesłanie i odbiór pliku, bo screena to bez problemu umiem zrobic. KOrzystam z Indy. Zaznaczam że probowalem korzystac z tego czegos co jest na 4p, ale ono jest napisane TSErw i TClientSocket oraz jak napisał autor jest nieskończone. MOżecie mi więc podać kod procedur, które po stronie serwa wysla plik, a po stronie klienta odbiora?
Możesz zrobić to za pomocą servera FTP... W opraciu o komponenty INDY !
Piszę taki program opraty na protokole TCP. Jest taka opcja, że wysyłam z klienta do serwa pakiet, ktory ma spowodowac u serwera pobranie i wyslanie screena a u klienta odbior i zapis do pliku. To jest moim problem - przesłanie i odbiór pliku, bo screena to bez problemu umiem zrobic. KOrzystam z Indy. Zaznaczam że probowalem korzystac z tego czegos co jest na 4p, ale ono jest napisane TSErw i TClientSocket oraz jak napisał autor jest nieskończone. MOżecie mi więc podać kod procedur, które po stronie serwa wysla plik, a po stronie klienta odbiora?
Najlepiej otworz plik i czytaj do tablicy 1024 elementowej i wysylaj ja funkcja writeBuffer :)
Dobry pomysl, ale nie bardzo wlasnie wiem jak wiec analizujmy, a jak cos to podpowiadajcie :D :
1. Tworzymy zmienna f typu file, ladujemy funkcjami assignFile i Reset.
2. (tego nie wiem jak zrobic) Ładujemy po kawałku np. 1kb bo zmiennej pakietowej i wysyłamy przez WriteBuffer.
3. POprzez klienta tworzymy nowy plik np. 1jpg (nie wiem jak).
4. Odczytujemy kawalki przez ReadBuffer.
5. Zapisujemy kawalki do pliku (nie wiem jak).
Pojawia się bład 'I/O error 1784'. Co on oznacza? Oto kod do przesyłu i dobioru.
Serwer(zdarzenie onExecute):
TotalSize := 0; AssignFile(SrcF, 'C:\Windows\screen.jpg'); try Reset(SrcF, 1); repeat Application.ProcessMessages; Sleep(10); Seek(SrcF, TotalSize); BlockRead(SrcF, Buffer, SizeOf(Buffer), RealSize); if RealSize > 0 then begin Athread.Connection.WriteBuffer(Buffer, RealSize); TotalSize := TotalSize + RealSize; end; until RealSize = 0; finally CloseFile(SrcF); end; end; end;
Kod ciągnięty i zdeka przerobiony z 4p, wiec nie wiem czy jest dobry.
Klient(w zdarzeniu przycisku odpowiadajacego za wyslanie pakietu proszace o screen):
tcpClient.ReadBuffer(pack, SizeOf(pack)); // To pomińcie - to odczytanie pakietu, ktory informuje klienta, że bedziemy screena wysyłać tcpClient.ReadBuffer(buffer, SizeOf(buffer)); assignFile(f, 'scr\1.jpg'); reset(f); BlockWrite(f, buffer, SizeOf(buffer)); closeFile(f);
Dobry pomysl, ale nie bardzo wlasnie wiem jak wiec analizujmy, a jak cos to podpowiadajcie :D :
1. Tworzymy zmienna f typu file, ladujemy funkcjami assignFile i Reset.
2. (tego nie wiem jak zrobic) Ładujemy po kawałku np. 1kb bo zmiennej pakietowej i wysyłamy przez WriteBuffer.
3. POprzez klienta tworzymy nowy plik np. 1jpg (nie wiem jak).
4. Odczytujemy kawalki przez ReadBuffer.
5. Zapisujemy kawalki do pliku (nie wiem jak).
Sprobuj usunac procedure seek...
btw- jesli chodzi o zapis sciagnietego pliku to musi sie to odbyc w petli :)
ps. jest identyczna aplikacja (imageserver) jaka ty robisz w demach indy ;)
Użytkownik Kajetanek edytował ten post 23 listopad 2005, 20:14
Sprobuj usunac procedure seek...
btw- jesli chodzi o zapis sciagnietego pliku to musi sie to odbyc w petli :)
ps. jest identyczna aplikacja (imageserver) jaka ty robisz w demach indy ;)
liczba:= rozmiar div 1024;
Jak juz obliczysz liczbe to robisz sobie mniej wiecej taki kod:
for i:= 1 to liczba do begin klient.ReadBuffer(paczka, 1024); blockwrite(plik, paczka, 1024, cos); end; if rozmiar mod 1024>0 then begin klient.readbuffer(paczka, rozmiar mod 1024); blockwrite(plik, paczka, sizeof(paczka), cos); end;
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Możesz zrobić to za pomocą servera FTP... W opraciu o komponenty INDY !
Piszę taki program opraty na protokole TCP. Jest taka opcja, że wysyłam z klienta do serwa pakiet, ktory ma spowodowac u serwera pobranie i wyslanie screena a u klienta odbior i zapis do pliku. To jest moim problem - przesłanie i odbiór pliku, bo screena to bez problemu umiem zrobic. KOrzystam z Indy. Zaznaczam że probowalem korzystac z tego czegos co jest na 4p, ale ono jest napisane TSErw i TClientSocket oraz jak napisał autor jest nieskończone. MOżecie mi więc podać kod procedur, które po stronie serwa wysla plik, a po stronie klienta odbiora?

Najlepiej otworz plik i czytaj do tablicy 1024 elementowej i wysylaj ja funkcja writeBuffer :)

Dobry pomysl, ale nie bardzo wlasnie wiem jak wiec analizujmy, a jak cos to podpowiadajcie :D :
1. Tworzymy zmienna f typu file, ladujemy funkcjami assignFile i Reset.
2. (tego nie wiem jak zrobic) Ładujemy po kawałku np. 1kb bo zmiennej pakietowej i wysyłamy przez WriteBuffer.
3. POprzez klienta tworzymy nowy plik np. 1jpg (nie wiem jak).
4. Odczytujemy kawalki przez ReadBuffer.
5. Zapisujemy kawalki do pliku (nie wiem jak).

Pojawia się bład 'I/O error 1784'. Co on oznacza? Oto kod do przesyłu i dobioru.
Serwer(zdarzenie onExecute):
TotalSize := 0; AssignFile(SrcF, 'C:\Windows\screen.jpg'); try Reset(SrcF, 1); repeat Application.ProcessMessages; Sleep(10); Seek(SrcF, TotalSize); BlockRead(SrcF, Buffer, SizeOf(Buffer), RealSize); if RealSize > 0 then begin Athread.Connection.WriteBuffer(Buffer, RealSize); TotalSize := TotalSize + RealSize; end; until RealSize = 0; finally CloseFile(SrcF); end; end; end;
Kod ciągnięty i zdeka przerobiony z 4p, wiec nie wiem czy jest dobry.
Klient(w zdarzeniu przycisku odpowiadajacego za wyslanie pakietu proszace o screen):
tcpClient.ReadBuffer(pack, SizeOf(pack)); // To pomińcie - to odczytanie pakietu, ktory informuje klienta, że bedziemy screena wysyłać tcpClient.ReadBuffer(buffer, SizeOf(buffer)); assignFile(f, 'scr\1.jpg'); reset(f); BlockWrite(f, buffer, SizeOf(buffer)); closeFile(f);
Dobry pomysl, ale nie bardzo wlasnie wiem jak wiec analizujmy, a jak cos to podpowiadajcie :D :
1. Tworzymy zmienna f typu file, ladujemy funkcjami assignFile i Reset.
2. (tego nie wiem jak zrobic) Ładujemy po kawałku np. 1kb bo zmiennej pakietowej i wysyłamy przez WriteBuffer.
3. POprzez klienta tworzymy nowy plik np. 1jpg (nie wiem jak).
4. Odczytujemy kawalki przez ReadBuffer.
5. Zapisujemy kawalki do pliku (nie wiem jak).

Sprobuj usunac procedure seek...
btw- jesli chodzi o zapis sciagnietego pliku to musi sie to odbyc w petli :)
ps. jest identyczna aplikacja (imageserver) jaka ty robisz w demach indy ;)
Użytkownik Kajetanek edytował ten post 23 listopad 2005, 20:14
Sprobuj usunac procedure seek...
btw- jesli chodzi o zapis sciagnietego pliku to musi sie to odbyc w petli :)
ps. jest identyczna aplikacja (imageserver) jaka ty robisz w demach indy ;)

liczba:= rozmiar div 1024;
Jak juz obliczysz liczbe to robisz sobie mniej wiecej taki kod:
for i:= 1 to liczba do begin klient.ReadBuffer(paczka, 1024); blockwrite(plik, paczka, 1024, cos); end; if rozmiar mod 1024>0 then begin klient.readbuffer(paczka, rozmiar mod 1024); blockwrite(plik, paczka, sizeof(paczka), cos); end;