Hi,

  I try to implement an Ftplet in order to serve a kind of
"virtual directory" on an FTP server.  That is, if I detect in
beforeCommand() that the client's command is a LIST on a specific
name, I want to compute the result to send back instead of
looking at an actual directory.

  So I use the following code in beforeCommand() (in my own class
that implements Ftplet):

    session.write(new DefaultFtpReply(150,
        "File status okay; about to open data connection."));

    DataConnectionFactory factory = session.getDataConnection();
    DataConnection cxion = factory.openConnection();
    cxion.transferToClient(session, "<file 1 info string>\r\n");
    cxion.transferToClient(session, "<file 2 info string>\r\n");
    factory.closeDataConnection();

    session.write(new DefaultFtpReply(226, "Closing data connection."));
    return FtpletResult.SKIP;

  But the second call to cxion.transferToClient() throws a socket
exception:

java.net.SocketException: Socket is closed
 at java.net.Socket.getOutputStream(Socket.java:828)
 at 
org.apache.ftpserver.impl.IODataConnection.getDataOutputStream(IODataConnection.java:107)
 at 
org.apache.ftpserver.impl.IODataConnection.transferToClient(IODataConnection.java:176)
 at org.fgeorges.ftpserver.FtpletTry$MyFtplet.beforeCommand(FtpletTry.java:156)
 at 
org.apache.ftpserver.ftpletcontainer.impl.DefaultFtpletContainer.beforeCommand(DefaultFtpletContainer.java:162)
 at 
org.apache.ftpserver.impl.DefaultFtpHandler.messageReceived(DefaultFtpHandler.java:196)
 at 
org.apache.ftpserver.listener.nio.FtpHandlerAdapter.messageReceived(FtpHandlerAdapter.java:61)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:716)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
 at 
org.apache.ftpserver.listener.nio.FtpLoggingFilter.messageReceived(FtpLoggingFilter.java:85)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
 at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:75)
 at 
org.apache.mina.filter.logging.MdcInjectionFilter.filter(MdcInjectionFilter.java:136)
 at 
org.apache.mina.filter.util.CommonEventFilter.messageReceived(CommonEventFilter.java:70)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
 at 
org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:427)
 at 
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:245)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
 at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
 at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:75)
 at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
 at 
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:780)
 at 
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:772)
 at 
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
 at java.lang.Thread.run(Thread.java:680)

  Any idea why this is the case?  And how to resolve it?

  Regards,

-- 
Florent Georges
http://fgeorges.org/
http://h2oconsulting.be/

Reply via email to