/************************************************************************* * Ce programme cree un socket TCP associe au port argv[0], attend une * demande de connexion, pour chaque demande de connexion. Il attend * la reception d'un fichier. Les donnees recues sont les suivantes: * - taille du nom du fichier sur un entier, * - taille du fichier sur un entier long, * - tableau de bytes contenant le nom du fichier, * - successions de tableaux de bytes de taille maximum 4096 octets * correspondant aux donnees du fichier. * * ex: java FileServerNioMain 2005 ************************************************************************/ package fileClientSenderSingle; import java.io.FileOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.SocketException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import csc4509.HeaderFTP; import csc4509.HeaderFTPStatus; public class FileServerReceiverMain { public static void main(String[] argv) { ServerSocketChannel listenChannel; ServerSocket listenSocket; boolean debugState = true; SocketChannel rwChan; InetSocketAddress rcvAddress; HeaderFTP head = null; ByteBuffer readBuf; int i = 1; if (argv.length != 1) { System.out.println("usage: java fileServer "); return; } // on cree le socket de connexion et lui associe un port // accept() est bloquant jusqu'a arrivee de demande de connexion try { listenChannel = ServerSocketChannel.open(); listenSocket = listenChannel.socket(); rcvAddress = new InetSocketAddress(Integer.parseInt(argv[0])); listenSocket.setReuseAddress(true); listenSocket.bind(rcvAddress); while (i > 0) { // accept one incoming connection System.out.println("Waiting for connection request..."); rwChan = listenChannel.accept(); System.out.println("Connection request accepted..."); FileChannel fc; long readSize, receivedSize = 0L; String fileName; try { readBuf = ByteBuffer.allocate(2048); do { readSize = rwChan.read(readBuf); if (debugState) { System.out.println(" Received : " + readSize); } receivedSize += readSize; readBuf.flip(); if(head == null){ head = new HeaderFTP(readBuf); }else{ head.completeHeader(readBuf); } }while(head.getHeadStatus() != HeaderFTPStatus.HeaderCompleted); // creates a new name by appending copy fileName = head.getFileName(); FileOutputStream fos = new FileOutputStream(fileName+ ".copy"); fc = fos.getChannel(); if (debugState) { System.out.println("filename:" + fileName + " filesize:" + head.getFileSize()); } receivedSize = readBuf.limit() -readBuf.position() ; if(receivedSize > 0){ fc.write(readBuf); } // loop to receive file content while (receivedSize < head.getFileSize()) { readBuf.clear(); readSize = rwChan.read(readBuf); if (debugState) { System.out.println("filename:" + head.getFileName() + " filesize:" + head.getFileSize()+ " receivedSize "+ receivedSize+ " readSize " + readSize); } receivedSize += readSize; readBuf.flip(); fc.write(readBuf); } fos.close(); rwChan.close(); } catch (IOException ie) { ie.printStackTrace(); return; } } listenChannel.close(); listenSocket.close(); } catch (SocketException se) { se.printStackTrace(); return; } catch (IOException ie) { ie.printStackTrace(); return; } } }