/************************************************************************* * 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 fileClientSenderSingleMsg; 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.HalfDuplexFTPWorker; import csc4509.MessageSequenceException; import csc4509.ReadMessageStatus; public class FileServerReceiverMsgMain { public static void main(String[] argv) throws MessageSequenceException { ServerSocketChannel listenChannel; ServerSocket listenSocket; boolean debugState = true; SocketChannel rwChan; InetSocketAddress rcvAddress; 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 if (debugState) System.out.println("Waiting for connection request..."); rwChan = listenChannel.accept(); if (debugState) System.out.println("Connection request accepted..."); FileChannel fc; FileOutputStream fos; HalfDuplexFTPWorker message = new HalfDuplexFTPWorker(rwChan); long writenSize, fileSize; String fileName; try { ReadMessageStatus status; int messType; status = message.readMessage(); if (status != ReadMessageStatus.ReadDataCompleted) { System.out .println("Connection closed in read message 1"); break; } messType = message.getMessType(); if (messType == 1) { writenSize = 0L; fileName = (String) message.getData(); System.out.println("filename:" + fileName); fos = new FileOutputStream(fileName + ".copy"); fc = fos.getChannel(); } else throw new MessageSequenceException( "Awaiting MessageType 1 and receiving " + messType); status = message.readMessage(); messType = message.getMessType(); if (messType == 2) { if (status != ReadMessageStatus.ReadDataCompleted) { System.out .println("Connection closed in read message 2"); break; } fileSize = (Long) message.getData(); System.out.println("filesize:" + fileSize); } else { fos.close(); throw new MessageSequenceException( "Awaiting MessageType 2 and receiving" + messType); } while (writenSize < fileSize) { status = message.readMessage(); if (status == ReadMessageStatus.ChannelClosed) { System.out .println("Connection closed in read message 3 received " + writenSize + "bytes"); break; } if (status == ReadMessageStatus.ReadDataCompleted) { messType = message.getMessType(); if (messType == 3) { // last message can be 2 or 3 int writen; byte[] buffer = (byte[]) message.getData(); ByteBuffer fileBuf = ByteBuffer .allocate(buffer.length); fileBuf.put(buffer); fileBuf.flip(); writen = fc.write(fileBuf); writenSize += writen; } else throw new MessageSequenceException( "Awaiting MessageType 3 and receiving " + messType); } } 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; } } }