/*********************************************************************** * Ce programme emet a destination du port argv[1] sur la machine * argv[0], le fichier passe en argument dans argv[2]. * * L'emission se fait par send sur un SocketChannel. * * Le protocole est le suivant : envoie de la taille du nom, puis du nom, puis * envoie de la taille du fichiers, suivi des donnees proprement * dites. * * ex: java fileClient linux03 2005 filename ***********************************************************************/ package fileClientSenderSingleMsg; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.channels.*; import csc4509.HalfDuplexFTPWorker; public class FileClientSenderMsgMain { public static void main(String[] argv) { HalfDuplexFTPWorker mess; SocketChannel rwChan; Socket rwCon; InetSocketAddress rcvAddress; byte dataBuf[] = new byte[4096]; ByteBuffer readBuf = ByteBuffer.allocate(4096); long totalSize, sentSize = 0L; boolean debugState = true; File file; FileInputStream fis; FileChannel fc; if (argv.length != 3) { System.out.println("usage: java fileClient " + " "); return; } try { InetAddress destAddr = InetAddress.getByName(argv[0]); rwChan = SocketChannel.open(); rwCon = rwChan.socket(); // on recupere l'adresse IP de la machine cible rcvAddress = new InetSocketAddress(destAddr, Integer.parseInt(argv[1])); // on connecte le socket d'emission au port distant rwCon.connect(rcvAddress); file = new File(argv[2]); fis = new FileInputStream(file); fc = fis.getChannel(); totalSize = file.length(); if (debugState) { System.out.println("Sending fileSize filename : " + totalSize + " " + argv[2]); } // put name size and file size into writeBuffer mess = new HalfDuplexFTPWorker(rwChan); mess.sendMsg(1, argv[2]); mess.sendMsg(2, totalSize); int readSize = 0; sentSize = 0L; do { // lecture d'un bloc du fichier original readSize = fc.read(readBuf); if (debugState) { System.out.println("Read size : " + readSize); } if (readSize > 0) { if (readSize < dataBuf.length) { dataBuf = new byte[readSize]; } sentSize += readSize; readBuf.flip(); mess.setHeader(3, readBuf.limit()); mess.setDataByteBuffer(readBuf); mess.sendBuffers(); readBuf.clear(); } } while (sentSize < totalSize); // fermeture du fichier et du socket d'emission fc.close(); fis.close(); rwChan.close(); rwCon.close(); } catch (SocketException se) { se.printStackTrace(); return; } catch (UnknownHostException ue) { ue.printStackTrace(); return; } catch (IOException ie) { ie.printStackTrace(); return; } System.out.println(totalSize + " bytes sent."); } }