Вот полный рабочий пример. Сервер:
package so6540787;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private final Socket socket;
public Server(Socket socket) {
this.socket = socket;
}
public void receiveFile(File file) throws IOException {
byte[] b = new byte[1024];
int len = 0;
int bytcount = 1024;
FileOutputStream inFile = new FileOutputStream(file);
InputStream is = socket.getInputStream();
BufferedInputStream in2 = new BufferedInputStream(is, 1024);
while ((len = in2.read(b, 0, 1024)) != -1) {
bytcount = bytcount + 1024;
inFile.write(b, 0, len);
}
System.out.println("Bytes Writen : " + bytcount);
// Sending the response back to the client.
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.flush();
oos.writeObject("ok");
System.out.println("Message sent to the client is " + "ok");
in2.close();
inFile.close();
}
public static void main(String[] args) throws IOException {
ServerSocket listen = new ServerSocket(10000, 1);
Socket socket = listen.accept();
Server server = new Server(socket);
server.receiveFile(new File("c:/received.pdf"));
}
}
А клиент:
package so6540787;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
private final Socket socket;
public Client(Socket socket) {
this.socket = socket;
}
public void sendFile(File file) throws IOException, ClassNotFoundException {
byte[] buf = new byte[1024];
OutputStream os = socket.getOutputStream();
BufferedOutputStream out = new BufferedOutputStream(os, 1024);
FileInputStream in = new FileInputStream(file);
int i = 0;
int bytecount = 1024;
while ((i = in.read(buf, 0, 1024)) != -1) {
bytecount = bytecount + 1024;
out.write(buf, 0, i);
out.flush();
}
socket.shutdownOutput(); /* important */
System.out.println("Bytes Sent :" + bytecount);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ois.skip(Long.MAX_VALUE);
String confirmation = (String) ois.readObject();
System.out.println("from server : " + confirmation);
out.close();
in.close();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Client client = new Client(new Socket("localhost", 10000));
client.sendFile(new File("c:/tobesent.pdf"));
}
}
Строка, которую вы пропустили, это "socket.shutdownOutput ()". Если вы пропустите эту строку, сервер никогда не увидит маркер конца файла -1
из вызова read
.
Пожалуйста, исправьте способ подсчета байтов, которые были отправлены. Вам действительно следует начинать с 0 вместо 1024 и увеличивать счетчик только на столько байтов, сколько вы действительно прочитали.