Wygląda na to, że popełniłeś klasyczny błąd gniazda. Podany kod i objaśnienie wydaje się zakładać obsadę gniazd w wiadomościach. One nie są. Użyty w ten sposób, używasz streaming internet sockets, który zapewnia strumień , a nie wiadomości.
Nie pokazujesz żadnego kodu, który faktycznie wysyła dane, więc domyślam się, że po prostu pompujesz dane pliku na drugą stronę i zamykasz połączenie. Jak inaczej będziesz wiedział, że udało ci się przenieść cały plik?
Ten zestaw reguł, które klient i serwer muszą przestrzegać, aby w sposób użyteczny wymieniać dane za pośrednictwem gniazd, nazywa się application protocol. Musisz będzie będzie musiał mieć jeden, w przeciwnym razie będziesz tylko wysyłanie danych do bóstwa $ wie, gdzie, i nie będziesz mieć nad nim żadnej kontroli. Oznacza to, że serwer i klient będą wiedzieli, co się dzieje, będą tylko wysyłać i odbierać dane i mieć nadzieję, że wszystko pójdzie dobrze. Więc nie ma "kilku linii", które musisz dodać do swojego kodu, będziesz musiał całkowicie go zrestrukturyzować.
Istnieje wiele sposobów definiowania protokołu aplikacji i wielu opcji do wyboru, więc pokażę ci dowolny: wyjaśnienie tekstowe wiadomości poprzedzonych identyfikatorem i długością ładunku (jeśli dotyczy), zarówno w nieokreślonych zmiennych numerycznych. Można na przykład wybrać czterobajtowe liczby całkowite z małych endianów.
Wiadomości w tym formacie są nazywane "Type/Length/Value" or TLV. więc określić te wiadomości:
ID Name Direction Description Payload
1 ServerHello Server -> Client The server sends this message None.
to every connecting client. Or maybe server or
protocol version.
2 MaxUpload Server -> Client Sent after the ServerHello. Maximum upload size
in bytes.
3 AllowedExts Server -> Client Allowed upload extensions, The allowed extensions.
comma-separated. Sent after
MaxUpload message.
10 IncomingFile Client -> Server There's a file coming. The file name.
11 FileUpload Client -> Server The file to upload. The file data.
Sent after IncomingFile.
Teraz wszystko, co wymagane jest wdrożenie tego protokołu w aplikacji serwera i klienta i gotowe.
Musisz także zdecydować, co zrobić, jeśli klient lub serwer nie przestrzega prototolu. Może na przykład wysłać wiadomość, której nie można przeanalizować, nieznany identyfikator wiadomości, długość komunikatu, którego nie chcesz obsługiwać, komunikat o niesłudze (FileUpload before IncomingFile) lub komunikat, który nie jest dostosuj komunikaty wysyłane wcześniej, tak jak klient przesyłający większy plik, niż serwer zgodził się na to, lub zaakceptował nieprawidłowe rozszerzenie. Musisz także myśleć o komunikatach "potwierdzenie" lub o odpowiedzi, takich jak serwer, który mówi klientowi "OK, śmiało, wyślij następną wiadomość".
Podsumowując, jest to szerokie pytanie o szerokim zakresie i niełatwo odpowiedzieć. Próbowałem odpowiedzieć na to w moim komentarzu do twojego pytania, które zostało usunięte. Tutaj masz odpowiedź.
Możesz dowiedzieć się więcej na ten temat w Internecie, na przykład Beej's Guide to Network Programming w powiązaniu z Giorgi (koniecznie przeczytaj cały przewodnik) i Stephen Cleary's blog.
Aby ustawić limit rozmiaru pliku, po prostu dodaj całkowity licznik rozmiaru danych, np. "Int counter = 0; counter + = recv;". Następnie, jeśli limit został przekroczony, klient zostaje upuszczony z odpowiednim komunikatem. –
Chcę tylko wysłać rozmiar pliku i dopuszczalnych formatów plików do klienta jako sson, jak klient łączy się, aby klient mógł wysyłać pliki odpowiednio @Alek Depler –
Hm, to musisz stworzyć własny protokół klient-serwer. Zarówno klient, jak i serwer mogą wysyłać dane do siebie nawzajem, należy podzielić wszystkie dane według dwóch typów: instrukcji protokołu technicznego i samych danych. Odpowiedź "CodeCaster" jest poprawna. –