Я создаю приложение, которое будет отправлять файл по сети через сокеты.Java: передача файлов клиент/сервер (неполные файлы)
Есть 2 программы. Сервер и клиент имеют два класса: «Загрузка и выгрузка».
public class Download implements Runnable{
public ServerSocket server;
public Socket socket;
public int port;
public String saveTo = "";
public InputStream In;
public FileOutputStream Out;
public Download(String saveTo){
try {
server = new ServerSocket(1544);
port = 1544;
this.saveTo = saveTo;
}
catch (IOException ex) {
System.out.println("Exception [Download : Download(...)]");
}
}
@Override
public void run() {
try {
socket = server.accept();
In = socket.getInputStream();
Out = new FileOutputStream(saveTo);
byte[] buffer = new byte[1024];
int count;
while((count = In.read(buffer)) >= 0){
Out.write(buffer, 0, count);
}
Out.flush();
if(Out != null){ Out.close(); }
if(In != null){ In.close(); }
if(socket != null){ socket.close(); }
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
и класс загрузки:
public class Upload implements Runnable{
public String addr;
public int port;
public Socket socket;
public FileInputStream In;
public OutputStream Out;
public File file;
public Upload(String addr, int port, File filepath){
super();
try {
file = filepath;
socket = new Socket("127.0.0.1",1545);
Out = socket.getOutputStream();
In = new FileInputStream(filepath);
}
catch (Exception ex) {
System.out.println("Exception [Upload : Upload(...)]");
}
}
@Override
public void run() {
try {
byte[] buffer = new byte[1024];
int count;
while((count = In.read(buffer)) >= 0){
Out.write(buffer, 0, count);
}
Out.flush();
if(In != null){ In.close(); }
if(Out != null){ Out.close(); }
if(socket != null){ socket.close(); }
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
А в классе сервера:
File myFile = new File("temp");
Upload upl = new Upload("temp", 1544,myFile)
fileThreadSend = new Thread(upl);
fileThreadSend.start();
и в классе клиента:
Download dwn = new Download("temp");
Thread fileThread = new Thread(dwn);
fileThread.start();
Проблема пробегов, но это Безразлично» t передать весь файл иногда он передает только 9kb, а иногда и 20 MBS. что не так? Я попытался выполнить поиск, но не нашел подходящего решения. Заранее спасибо
Возможно, это опечатка - но это не ваш класс загрузки, который всегда создает сокет на порту 1545 и игнорирует переданный параметр порта? Если это не опечатка - вы можете загрузить в другой порт, чем вы думали. Для чего это стоит - код отлично переносится на моей машине (клиент и сервер, работающий на одном компьютере), хотя он не закрывает сокеты чисто при ошибке. Интересно, может ли что-то прервать один из потоков? Вы тестируете клиент и сервер на одном компьютере или разные? –
Нет, вы правы, это опечатка, в полной программе это один и тот же порт с обеих сторон. Я тестирую на той же машине. – user3538203
OK - хорошо - я не могу сделать это неудачным в этом сценарии (т. Е. Не может воспроизвести сбой). Получаете ли вы какие-либо исключения, когда копируется только часть файла? Есть ли причина, по которой вы хотите реализовать собственное клиентское серверное решение через собственную реализацию Thread, работающую напрямую с сокетами? –