// ftp 程序Ftp.java

// 此程序的功能是建立与ftp服务器的连接并实现文件传输

// 使用方法:java Ftp 服务器地址

//启动示例:java Ftp kiku.fuis.fukui-u.ac.jp

// 导入库

import java.net.*;

import java.io.*;

// Ftp类

public class Ftp {

// 准备

Socket ctrlSocket;//控制用Socket

public PrintWriter ctrlOutput;//控制输出用的流

public BufferedReader ctrlInput;// 控制输入用的流

final int CTRLPORT = 21 ;// ftp 的控制用端口

// openConnection方法

//由地址和端口号构造Socket,形成控制用的流

public void openConnection(String host)

throws IOException,UnknownHostException

{

ctrlSocket = new Socket(host, CTRLPORT);

ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());

ctrlInput

= new BufferedReader(new InputStreamReader

(ctrlSocket.getInputStream()));

}

// closeConnection方法

//关闭控制用的Socket

public void closeConnection()

throws IOException

{

ctrlSocket.close() ;

}

// showMenu方法

// 输出ftp的命令菜单

public void showMenu()

{

System.out.println(">Command?") ;

System.out.print("2 ls") ;

System.out.print(" 3 cd") ;

System.out.print(" 4 get") ;

System.out.print(" 5 put") ;

System.out.print(" 6 ascii") ;

System.out.print(" 7 binary") ;

System.out.println(" 9 quit") ;

}

// getCommand方法

// 读取用户指定的命令序号

public String getCommand()

{

String buf = "" ;

BufferedReader lineread

= new BufferedReader(new InputStreamReader(System.in)) ;

while(buf.length() != 1){// 循环接收一个字符的输入

try{

buf = lineread.readLine() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

return (buf) ;

}

// doLogin方法

// 登录到ftp服务器

public void doLogin()

{

String loginName = "" ;

String password = "" ;

BufferedReader lineread

= new BufferedReader(new InputStreamReader(System.in)) ;

try{

System.out.println("请输入用户名") ;

loginName = lineread.readLine() ;

// 利用USER命令登录

ctrlOutput.println("USER " + loginName) ;

ctrlOutput.flush() ;

// 利用PASS命令输入口令

System.out.println("请输入口令") ;

password = lineread.readLine() ;

ctrlOutput.println("PASS " + password) ;

ctrlOutput.flush() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doQuit方法

// 从ftp服务器注销

public void doQuit()

{

try{

ctrlOutput.println("QUIT ") ;// 发送QUIT命令

ctrlOutput.flush() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doCd方法

// 切换目录

public void doCd()

{

String dirName = "" ;

BufferedReader lineread

= new BufferedReader(new InputStreamReader(System.in)) ;

try{

System.out.println("请输入目录名") ;

dirName = lineread.readLine() ;

ctrlOutput.println("CWD " + dirName) ;// CWD命令

ctrlOutput.flush() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doLs方法

// 取得目录信息

public void doLs()

{

try{

int n ;

byte[] buff = new byte[1024] ;

// 建立数据连接

Socket dataSocket = dataConnection("LIST") ;

// 准备读取数据用的流

BufferedInputStream dataInput

= new BufferedInputStream(dataSocket.getInputStream()) ;

// 读取目录信息

while((n = dataInput.read(buff)) > 0){

System.out.write(buff,0,n) ;

}

dataSocket.close() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// dataConnection方法

// 构造与服务器交换数据用的Socket

// 再用PORT命令将端口通知服务器

public Socket dataConnection(String ctrlcmd)

{

String cmd = "PORT " ; //PORT存放用PORT命令传递数据的变量

int i ;

Socket dataSocket = null ;// 传送数据用Socket

try{

// 得到自己的地址

byte[] address = InetAddress.getLocalHost().getAddress() ;

// 用适当的端口号构造服务器

ServerSocket serverDataSocket = new ServerSocket(0,1) ;

// 准备传送PORT命令用的数据

for(i = 0; i < 4; ++i)

cmd = cmd + (address[i] & 0xff) + "," ;

cmd = cmd + (((serverDataSocket.getLocalPort()) / 256) & 0xff)

+ ","

+ (serverDataSocket.getLocalPort() & 0xff) ;

// 利用控制用的流传送PORT命令

ctrlOutput.println(cmd) ;

ctrlOutput.flush() ;

// 向服务器发送处理对象命令(LIST,RETR,及STOR)

ctrlOutput.println(ctrlcmd) ;

ctrlOutput.flush() ;

// 接受与服务器的连接

dataSocket = serverDataSocket.accept() ;

serverDataSocket.close() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

return dataSocket ;

}

// doAscii方法

// 设置文本传输模式

public void doAscii()

{

try{

ctrlOutput.println("TYPE A") ;// A模式

ctrlOutput.flush() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doBinary方法

// 设置二进制传输模式

public void doBinary()

{

try{

ctrlOutput.println("TYPE I") ;// I模式

ctrlOutput.flush() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doGet方法

// 取得服务器上的文件

public void doGet()

{

String fileName = "" ;

BufferedReader lineread

= new BufferedReader(new InputStreamReader(System.in)) ;

try{

int n ;

byte[] buff = new byte[1024] ;

// 指定服务器上的文件名

System.out.println("??????????????") ;

fileName = lineread.readLine() ;

// 在客户端上准备接收用的文件

FileOutputStream outfile = new FileOutputStream(fileName) ;

// 构造传输文件用的数据流

Socket dataSocket = dataConnection("RETR " + fileName) ;

BufferedInputStream dataInput

= new BufferedInputStream(dataSocket.getInputStream()) ;

// 接收来自服务器的数据,写入本地文件

while((n = dataInput.read(buff)) > 0){

outfile.write(buff,0,n) ;

}

dataSocket.close() ;

outfile.close() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// doPut方法

// 向服务器发送文件

public void doPut()

{

String fileName = "" ;

BufferedReader lineread

= new BufferedReader(new InputStreamReader(System.in)) ;

try{

int n ;

byte[] buff = new byte[1024] ;

FileInputStream sendfile = null ;

// 指定文件名

System.out.println("请输入文件名") ;

fileName = lineread.readLine() ;

// 准备读出客户端上的文件

try{

sendfile = new FileInputStream(fileName) ;

}catch(Exception e){

System.out.println("文件不存在") ;

return ;

}

// 准备发送数据的流

Socket dataSocket = dataConnection("STOR " + fileName) ;

OutputStream outstr = dataSocket.getOutputStream() ;

// 读出文件,并利用网络发送给服务器

while((n = sendfile.read(buff)) > 0){

outstr.write(buff,0,n) ;

}

dataSocket.close() ;

sendfile.close() ;

}catch(Exception e)

{

e.printStackTrace();

System.exit(1);

}

}

// execCommand方法

// 执行与各命令相应的处理

public boolean execCommand(String command)

{

boolean cont = true ;

switch(Integer.parseInt(command)){

case 2 : // 显示服务器目录信息

doLs() ;

break ;

case 3 : // 切换服务器的工作目录

doCd() ;

break ;

case 4 : // 取得服务器上的文件

doGet() ;

break ;

case 5 : // 向服务器发送文件

doPut() ;

break ;

case 6 : // 文件传输模式

doAscii() ;

break ;

case 7 : // 二进制传输模式

doBinary() ;

break ;

case 9 : // 处理结束

doQuit() ;

cont = false ;

break ;

default : //其他输入

System.out.println("请选择一个序号") ;

}

return(cont) ;

}

// main_proc方法

// 输出ftp的命令菜单,调用各种处理方法

public void main_proc()

throws IOException

{

boolean cont = true ;

try {

// 进行登录

doLogin() ;

while(cont){

// 输出菜单

showMenu() ;

// 接收并执行命令

cont = execCommand(getCommand()) ;

}

}

catch(Exception e){

System.err.print(e);

System.exit(1);

}

}

// getMsgs方法

// 启动从控制流收信的线程

public void getMsgs(){

try {

CtrlListen listener = new CtrlListen(ctrlInput) ;

Thread listenerthread = new Thread(listener) ;

listenerthread.start() ;

}catch(Exception e){

e.printStackTrace() ;

System.exit(1) ;

}

}

// main方法

// 建立TCP连接,开始处理

public static void main(String[] arg){

try {

Ftp f = null;

if(arg.length < 1){

System.out.println("usage: java Ftp ") ;

return ;

}

f = new Ftp();

f.openConnection(arg[0]); // 控制连接建立

f.getMsgs() ; // 启动接收线程

f.main_proc(); // ftp 处理

f.closeConnection() ; // 关闭连接

System.exit(0) ; // 结束程序

}catch(Exception e){

e.printStackTrace();

System.exit(1);

}

}

}

// CtrlListen 类

class CtrlListen implements Runnable{

BufferedReader ctrlInput = null ;

// 构造器 指定读取地址

public CtrlListen(BufferedReader in){

ctrlInput = in ;

}

public void run(){   while(true){    try{ // 按行读入并输出到标准输出上     System.out.println(ctrlInput.readLine()) ;    } catch (Exception e){     System.exit(1) ;    }   }  } }

java与ftp连接_建立与ftp服务器的连接——完成版(java)相关推荐

  1. websocket——Firefox 无法建立到 ws://... 服务器的连接

    页面访问java websocket服务时,出现异常,Firefox下的异常是:Firefox 无法建立到 ws://... 服务器的连接: IE下的异常是:WebSocket Error: Inco ...

  2. ftp无法与服务器建立连接_建立与Oracle数据库服务器连接的两种连接模式

    建立与Oracle数据库服务器连接的两种连接模式(专用服务器与共享服务器) 在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式.在Orac ...

  3. java 安卓客户端开发_《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端...

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  4. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...

    本文已经收录自 https://github.com/Snailclimb/JavaGuide  (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...

  5. python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...

    使用Jython对Java做单元测试,当然,为了测试开发java代码.这涉及到引入第三包的问题,如何导入第三方的包? 您可以使用http://blog.csdn.net/powerccna/artic ...

  6. 解决报错:无法建立到笔记本服务器的连接。我们会继续尝试重连。请检查网络连接还有服务配置

    在配置notebook的pytorch环境时,切换python虚拟环境后连接不到内核,在这篇文章中得以解决: zJupyter Notebook更改kernel时出现服务连接问题:到后台服务的连接没能 ...

  7. robo 3t连接_使用robo 3t studio 3t连接到地图集

    robo 3t连接 Robo 3T (formerly Robomongo) is a graphical application to connect to MongoDB. The newest ...

  8. m未能建立与ppp服务器的连接6,未能建立与ppp服务器

    未能建立与ppp服务器 内容精选 换一换 ELB的常见异常返回码有400.403.502.504等.若遇到这些返回码建议您先直接访问后端云服务器,查看是否是后端云服务器的异常.若后端云服务器响应正常, ...

  9. hp 交换机远程连接_光收发器怎么安装,光纤收发器连接示意图解

    对于光纤布线来讲光纤收发器都是非常熟悉的产品了,在光纤网络中,我们常常会使用到光纤收发器,那么,在网络布线过程中光纤收发器该怎么连接呢?接下来飞畅科技的小编就来为大家介绍下光纤收发器安装以及连接图解, ...

最新文章

  1. centos7 install 安装mysql
  2. python【蓝桥杯vip练习题库】BASIC-18 矩形面积交(线段交)
  3. 计算机基础7试题,大学计算机应用基础试题
  4. js 格式化 java时间格式化_javascript时间格式化
  5. [WorldWind学习]5.相机对象
  6. [原]当你用%查不到记录的时候怎么办?
  7. eclipse 项目 链接 oracle 空指针,Eclipse 常用配置技巧
  8. MySQL Identifiers(标识符)
  9. HttpContext.Current.Session.SessionID相关问题及备忘
  10. 信息技术产业的黄金十年?听听他怎么说
  11. dojochina ExtJS视频解压密码
  12. 如何解决PHP上传中文出错,如何解决php上传中文乱码的问题
  13. UVa 11178:Morley’s Theorem(两射线交点)
  14. java饼状图获取数据集_HighChars3D饼图(从后台获取数据)
  15. st7789s显示芯片驱动代码
  16. Laravel文档 翻译合集
  17. 完全没有建站经验的人,怎么自己做网站
  18. 学习计划大纲(大一)
  19. 性能测试指标及常用的监控工具
  20. Apache web服务器(LAMP架构)

热门文章

  1. SETUP FACTORY安装完成后自动运行软件
  2. html5 spin,HTML5 number spinbox controls not triggering a cha
  3. Java写计算器自闭了
  4. python只显示重复值_使用内置条件格式的OpenPyXL:重复值和唯一值
  5. python标准库:fractions有理数
  6. jenkins邮件模板配置
  7. 群晖 Drive 的团队文件夹显示 “无法取得“
  8. 报表开发工程师面试准备
  9. DevEco studio工具栏的打开与隐藏
  10. 如何读取环境变量值?Go 每日一库之 godotenv