yadianna 发表于 2015-5-26 13:41:28

android ftp 服务器

  源码地址:http://ppareit.github.com/swiftp/   git clone git://github.com/ppareit/swiftp
  1、获取手机的wifi 地址作为 ftp 服务器的地址



public static InetAddress getWifiIp()
{
Context myContext = Globals.getContext();
if (myContext == null)
{
throw new NullPointerException("Global context is null");
}
WifiManager wifiMgr = (WifiManager) myContext.getSystemService(Context.WIFI_SERVICE);
if (isWifiEnabled())
{
int ipAsInt = wifiMgr.getConnectionInfo().getIpAddress();
if (ipAsInt == 0)
{
return null;
}
else
{
return Util.intToInet(ipAsInt);
}
}
else
{
return null;
}
}
public static boolean isWifiEnabled()
{
Context myContext = Globals.getContext();
if (myContext == null)
{
throw new NullPointerException("Global context is null");
}
WifiManager wifiMgr = (WifiManager) myContext.getSystemService(Context.WIFI_SERVICE);
if (wifiMgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED)
{
return true;
}
else
{
return false;
}
}
  2、创建服务器套接字 listenSocket, 端口号可以自定义



      listenSocket = new ServerSocket();
listenSocket.setReuseAddress(true);
listenSocket.bind(new InetSocketAddress(port));
  3、用子线程TcpListener封装 listenSocket



while (!shouldExit)
{
if (acceptWifi)
{
if (wifiListener != null)
{
if (!wifiListener.isAlive())
{
myLog.l(Log.DEBUG, "Joining crashed wifiListener thread");
try
{
wifiListener.join();
}
catch (InterruptedException e)
{
}
wifiListener = null;
}
}
if (wifiListener == null)
{
// Either our wifi listener hasn't been created yet, or has
// crashed,
// so spawn it
wifiListener = new TcpListener(listenSocket, this);
wifiListener.start();
}
}
}
  
  4、listensocket 在TcpListener 线程的run 方法中循环监听客户端请求,并且将建立链接的clientSocket 封装到会话线程



public void run()
{
try
{
while (true)
{
Socket clientSocket = listenSocket.accept();
myLog.l(Log.INFO, "New connection, spawned thread");
SessionThread newSession = new SessionThread(clientSocket, new NormalDataSocketFactory(), SessionThread.Source.LOCAL);
newSession.start();
ftpServerService.registerSessionThread(newSession);
}
}
catch (Exception e)
{
myLog.l(Log.DEBUG, "Exception in TcpListener");
}
}
  5、在会话进程的run方法中循环处理客户端都请求



public void run()
{
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(cmdSocket.getInputStream()), 8192);
while (true)
{
String line;
line = in.readLine(); // will accept \r\n or \n for terminator
if (line != null)
{
FTPServerService.writeMonitor(true, line);
myLog.l(Log.DEBUG, "Received line from client: " + line);
FtpCmd.dispatchCommand(this, line);
}
else
{
myLog.i("readLine gave null, quitting");
break;
}
}
}
catch (IOException e)
{
myLog.l(Log.INFO, "Connection was dropped");
}
closeSocket();
}
  6、FtpCmd是所有命令类的父抽象类,在dispatchCommand方法中根据输入流中的参数判断命令类型,然后执行对应的命令
页: [1]
查看完整版本: android ftp 服务器