так-с, сабж уже не актуален - разобрался.
касательно контрольной суммы, завтра буду имитировать дисконнект и смотреть что получится, так что спасибо за идею, Electronik
зы, для приличия - выкладываю упрощенное решение:
1. Server.java - сервер (получатель):
Код: Выделить всё
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static final int port = 11111;
private static ServerSocket ss;
private Socket socket;
public Server() {
init();
}
private void init() {
String[] files = new String[] { "destenation/30.mp4", "destenation/file1.pdf", "destenation/Swing.djvu" };
long[] lens = new long[] { 349301530L, 4095L, 32252057L };
if ( files == null || lens == null || files.length != lens.length ) {
System.exit(1);
}
try {
ss = new ServerSocket(port);
for ( ; ; ) {
socket = ss.accept();
for ( int i = 0; i < files.length; i++ ) {
SocketUtil.receive(socket, new File(files[i]), lens[i]);
}
if ( socket.isConnected() ) {
socket.close();
}
}
} catch ( IOException e ) {
e.printStackTrace(System.out);
}
}
public static void main(String[] args) {
new Server();
}
}
2. Client.java - клиент (отправитель):
Код: Выделить всё
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client implements Runnable {
private static final String host = "localhost";
private static final int port = 11111;
private Socket socket;
public Client() {}
@Override
public void run() {
init();
}
private void init() {
String[] files = new String[] { "source/30.mp4", "source/file1.pdf", "source/Swing.djvu" };
try {
socket = new Socket(host, port);
for ( int i = 0; i < files.length; i++ ) {
SocketUtil.transmit(socket, new File(files[i]));
}
} catch ( UnknownHostException e ) {
e.printStackTrace(System.out);
} catch ( IOException e ) {
e.printStackTrace(System.out);
}
}
public static void main(String[] args) {
new Thread(new Client()).start();
}
}
3. SocketUtil.java - класс, содержащий необходимые функции для передачи (transfer) и получения (receive):
Код: Выделить всё
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class SocketUtil {
private static final int size = 64 * 1024; // 64 KB
private SocketUtil() {}
public static void transmit(Socket socket, File file) {
try {
OutputStream os = socket.getOutputStream();
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[size];
for ( int count = -1; ( count = is.read(buffer) ) != -1; ) {
os.write(buffer, 0, count);
}
os.flush();
is.close();
} catch ( IOException e ) {
System.out.println("SocketUtil.transmits(): IO error.");
e.printStackTrace(System.out);
}
}
public static void receive(Socket socket, File file, long len) {
try {
InputStream is = socket.getInputStream();
OutputStream os = new FileOutputStream(file);
byte[] buffer = new byte[size];
for ( int count = is.read(buffer), total = count; count != -1; count = is.read(buffer), total += count ) {
os.write(buffer, 0, count);
if ( total == len ) {
break;
}
}
os.flush();
os.close();
} catch ( IOException e ) {
System.out.println("SocketUtil.receive(): IO error.");
e.printStackTrace(System.out);
}
}
}
всем спасибо.