各位好:     
       最近本人实施的项目过程出现了一个巨难的题目,请各位帮忙李碧纯.   
    
  项目名称:   网关系统   GateWay   (java   开发)   
    
  系统简介,   我们原来的网关系统负责将公司下面几十家门店的资料在晚上   FTP   上传到老的网关系统,用的是   WIN2000   自带的   FTP   服务.   现在我们准备用新的   java   
  开发的   FTP   服务器,   不用   win   2000   Server   自带的   FTP   服务   .   
    
  1:   原来下面的门店可以用   win   2000   ftp   服务正确上下传文件   
    
  2:   我们下面的门店拨号上网后通过一个终端软件将文件上传,       
      我们的   FTP   服务器都会经过我们的网关   IP   :     162.16.251.249     
    
  3:     a:     我的新的   FTP   服务器当服务器和客户门店都在同一局域网内能正常上下传文件   
        b:       当我的FTP   服务器拨号上网,   客户门店用拨号的因特网地址连接我的   FTP   服务   
  器时,   也可以正常上下传文件   
        c:       出现问题只有在我的门店拨号上网,   门店用通过该FTP   服务器的外部   IP   来访问   
                  这个FTP   服务器(注:   该   FTP   服务器位于局域网内),   正常上下产文件   
    
  4:   现在新开发的   FTP   出现的问题:     
        a:     下面的门店可以连接登陆到我的   FTP   server   
        b:     但是在上传文件的时候出现异常,   异常信息如下   :     
                [06/03   00:40:40   (INF)]   Handling   new   request   from   162.16.251.249   
  [06/03   00:40:40   (INF)]   New   connection   from   162.16.251.249   
  [06/03   00:40:41   (INF)]   User   login   -   162.16.251.249   -   admin   
  [06/03   00:41:05   (WAR)]   java.net.ConnectException:   Connection   timed   out:   connect   
  at   java.net.PlainSocketImpl.socketConnect(Native   Method)   
  at   java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)   
  at   java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)   
  at   java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)   
  at   java.net.Socket.connect(Socket.java:426)   
  at   java.net.Socket.connect(Socket.java:376)   
  at   java.net.Socket.<init>(Socket.java:291)   
  at   java.net.Socket.<init>(Socket.java:147)   
  at   ranab.server.ftp.FtpDataConnection.getDataSocket(FtpDataConnection.java:150)   
  at   ranab.server.ftp.FtpConnection.doSTOR(FtpConnection.java:1066)   
  at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native   Method)   
  at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   
  at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   
  at   java.lang.reflect.Method.invoke(Method.java:324)   
  at   ranab.server.ftp.BaseFtpConnection.service(BaseFtpConnection.java:120)   
  at   ranab.server.ftp.BaseFtpConnection.run(BaseFtpConnection.java:96)   
  at   java.lang.Thread.run(Thread.java:536)   
    
  c:   注释:     162.16.251.249   是我公司的局域网的网关   
  d:   注释:     出错的一行FtpDataConnection.java:150   
  mDataSoc   =   new   Socket(mAddress,   miPort)   这里   
    
  FtpDataConnection.getDataSocket   相关代码如下   
                            /**   
            *   Get   the   data   socket.   In   case   of   error   returns   null.   
            */   
          public   Socket   getDataSocket()   {   
    
                  try   {   
    
                          //   get   socket   depending   on   the   selection   
                          if(mbPort)   {   
                                  mDataSoc   =   new   Socket(mAddress,   miPort);   
                          }   
                          else   if(mbPasv)   {   
                                  mDataSoc   =   mServSoc.accept();   
                          }   
                  }   
                  catch(Exception   ex)   {   
                          mConfig.getLogger().warn(ex);   
                          mDataSoc   =   null;   
                  }   
    
  e:   本人发现在我的   FTP   服务器引擎程序中一段:     
        public   void   run()   {   
                  while   (mRunner   !=   null)   {   
                          try   {   
                                  Socket   datasocket   =   mServerSocket.accept();   
                                  //add   test   
                                  String   clientip   =   datasocket.getInetAddress().getHostAddress()   ;   
                                  int   clientport   =   datasocket.getPort()   ;   
                                  System.out.println("SeverEngine.clientip   =   "   +   clientip)   ;   
                                  System.out.println("SeverEngine.clientport   =   "   +   clientport)   ;   
                                  mServer.serveRequest(datasocket);   
                          }   
                          catch   (Exception   ex)   {   
                          }   
                  }   
          }   
    
  在这里我发现这个   datasocket   得到的客户门店的   IP   clientip   总是为我公司的网关地   
  址:   162.16.251.249   ,   为什么这个客户端能够登陆我的   FTP   服务器,   一上传文件就会有   
  错,   是不是局域网内服务器与外面有   Socket   通信时,   这个   Socket   的客户端   IP   总是   
  显示为该局域网网关的   IP   地址,   如果有问题,   那为什么,   同样的情况的下,   其他的都   
  不变,   客户端能正常上下传   win2000   自带的   FTP   服务.   百思不得其解,   希望各位高手   
  不吝赐教哦     !!!