给出一个C++或Java编写的ftp服务器程序
给一个C++或Java编写的ftp服务器程序,给出后我会给你追加100点,如果给不出,那告诉我一些需要的相关知识和设计思路也可以...
给一个C++或Java编写的ftp服务器程序,给出后我会给你追加100点,如果给不出,那告诉我一些需要的相关知识和设计思路也可以
展开
3个回答
展开全部
Socket TCP
反射API介绍
4.Java Socket编程 TCP 协议编程
1) TCP工作模型: 先找
堂(主机/IP), 到食堂以后找窗口
(Socket/套接字 端口号), 服务员等待连接,客户向服务员发起连接
连接以后, 一个窗口可以为每个客户安排一个服务员(线程)提供服务,
每个服务过程可以双向交流通讯(流), 通讯完成后要关闭连接.
5. TCP 服务端编程(食堂)(java.io.*,java.net.*,java.lang.*)
1) 创建ServerSocket实例绑定一个服务端口(Socket/套接字 端口号)
2) 开始ServerSocket实例 的监听, 等待客户端的连接
3) 如果有客户连接进来, 就获得了客户的套接字(Socket)实例
客户的套接字(Socket)实例中包括与客户端建立的连接流
4) 为这个客户(Socket) 创建一个服务线程, 提供服务(run方法)
5) 继续等待下一个连接, 返回到2)
6) 服务线程 完成通讯服务过程
7) 端口号: 0~65535, 1K以下留给系统使用
6. TCP 客户端编程
1) 创建Socket 实例, 连接到服务器端, 成功创建s就表示连接到了
服务器
Socket s = new Socket("host", port)
2) 客户端 Socket 与服务器端 Socket 对应, 都包含输入, 输出流
客户端的s.getInputStream() 连接于服务器s.getOutputStream()
客户端的s.getOutputStream()连接于服务器s.getInputStream()
3) 使用线程处理 网络流
7. Java 反射
1) 反射是Java自我管理(类, 对象)的机制
2) * 可以通过反射机制发现对象的类型 发现类型的方法/属性/构造器
3) * Java 反射 可以创建对象 并 访问任意对象方法和属性等
4) Class 加载
类加载到内存: java 将磁盘类文件加载到内存中,为一个对象(实例)
这个对象是Class的实例, 也就是 这些对象都是Class实例
5)Class 实例代表Java中类型, 基本类型的类型: int.class, long.class
类类型 Class 实例获得如下:
Class cls = String.class;
Class cls = Class.forName("java.lang.String");
Class cls = "abc".getClass();
以上方法获得cls 是同一个对象, 就是String 类内存加载的结果
package javase2.day06.ftp;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* ftp 客户端 可以使用命令 ls pwd get
*/
public class FtpClient {
public static void main(String[] args)
throws IOException{
FtpClient client = new FtpClient();
client.open();
}
public void open() throws IOException{
Socket s = new Socket("localhost", 9000);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//处理客户端对服务器的请求
new RequestProcess(out).start();
//处理服务器的反馈信息
new ResponseProcess(in).start();
}
//处理客户端对服务器的请求
class RequestProcess extends Thread{
OutputStream out;
public RequestProcess(OutputStream out) {
this.out = out;
}
public void run() {
try{
Scanner sc = new Scanner(System.in);
while(true){
String s = sc.nextLine();
IOUtils.println(out, s);
if(s.equals("bye")){
System.exit(0);
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
class ResponseProcess extends Thread{
InputStream in;
public ResponseProcess(InputStream in) {
this.in = in;
}
public void run() {
try{
while(true){
String header = IOUtils.readLine(in);
if(header.startsWith("text,")){
show(header,in);
}else if(header.startsWith("file,")){
save(header, in);
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public void show(String header, InputStream in)
throws IOException {
int n = Integer.parseInt(header.split(",")[1]);
for(int i=0; i<n; i++){
String s = IOUtils.readLine(in);
System.out.println(s);
}
}
public void save(String header, InputStream in)
throws IOException{
File dir = new File("ftp");
if(!dir.exists()){
dir.mkdir();
}
//header: file,10,filename
String[] data = header.split(",");
long length = Long.parseLong(data[1]);
String filename = data[2];
File file = new File(dir, filename);
BufferedOutputStream out =
new BufferedOutputStream(
new FileOutputStream(file));
for(long i=0; i<length; i++){
int b = in.read();
out.write(b);
}
out.close();
}
}
package javase2.day06.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 模拟FTP服务器, 支持命令pwd,ls,get file
*
* 协议: type,length,value TLV格式
*
* 文本: text,5\nline1\nline2\nline3\nline4\nline5\n
* 文件: file,4,filename\n 41 42 43 44
*
* text,5\nline1\nline2\nline3\nline4\nline5\nfile,4,filename\n 41 42 43 44
*/
public class FtpServer {
public static void main(String[] args)
throws IOException{
FtpServer server = new FtpServer();
server.start();
}
public void start() throws IOException{
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
new Agent(s).start();
}
}
class Agent extends Thread{
Socket s;
public Agent(Socket s) {
this.s = s;
}
public void run() {
try{
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//向客户端发送, 先发协议头,再发送文本行
out.write("text,1\n".getBytes());//协议头
//发送消息内容, 一行文本消息
out.write("欢迎使用FTP演示服务器!\n".getBytes());
out.flush();
while(true){
//读取客户端发送到命令
String cmd = IOUtils.readLine(in).trim();
if("pwd".equals(cmd)){//显示当前目录
pwd(out);
}else if("ls".equals(cmd)){
ls(out);
}else if(cmd.startsWith("get ")){
get(cmd, out);
}else if("bye".equalsIgnoreCase(cmd)){
IOUtils.println(out, "text,1");
IOUtils.println(out, "Bye, Bye!");
s.close();
}else{
out.write("text,1\n".getBytes());//协议头
out.write("只支持pwd,ls,get,bye!\n".getBytes());
out.flush();
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public void pwd(OutputStream out)
throws IOException{
File dir = new File(".");
IOUtils.println(out, "text,1");
IOUtils.println(out, dir.getCanonicalPath());
}
public void ls(OutputStream out)
throws IOException{
File dir = new File(".");
File[] files = dir.listFiles();
IOUtils.println(out, "text,"+files.length);
for (File f : files) {
if(f.isDirectory()){
IOUtils.println(out, "["+f.getName()+"]");
}else{
IOUtils.println(out, f.getName());
}
}
}
public void get(String cmd, OutputStream out)
throws IOException{
//cmd="get filename"
String name = cmd.split("\\s+")[1];
File file = new File(name);
if(! file.exists()){
IOUtils.println(out, "text,1");
IOUtils.println(out, "没有文件呀!"+name);
return;
}
//文件协议头:
IOUtils.println(out,
"file,"+file.length()+","+name);
FileInputStream in =
new FileInputStream(file);
IOUtils.cp(in, out);
out.flush();
in.close();
IOUtils.println(out, "text,1");
IOUtils.println(out, "发送成功:"+name);
}
}
反射API介绍
4.Java Socket编程 TCP 协议编程
1) TCP工作模型: 先找
堂(主机/IP), 到食堂以后找窗口
(Socket/套接字 端口号), 服务员等待连接,客户向服务员发起连接
连接以后, 一个窗口可以为每个客户安排一个服务员(线程)提供服务,
每个服务过程可以双向交流通讯(流), 通讯完成后要关闭连接.
5. TCP 服务端编程(食堂)(java.io.*,java.net.*,java.lang.*)
1) 创建ServerSocket实例绑定一个服务端口(Socket/套接字 端口号)
2) 开始ServerSocket实例 的监听, 等待客户端的连接
3) 如果有客户连接进来, 就获得了客户的套接字(Socket)实例
客户的套接字(Socket)实例中包括与客户端建立的连接流
4) 为这个客户(Socket) 创建一个服务线程, 提供服务(run方法)
5) 继续等待下一个连接, 返回到2)
6) 服务线程 完成通讯服务过程
7) 端口号: 0~65535, 1K以下留给系统使用
6. TCP 客户端编程
1) 创建Socket 实例, 连接到服务器端, 成功创建s就表示连接到了
服务器
Socket s = new Socket("host", port)
2) 客户端 Socket 与服务器端 Socket 对应, 都包含输入, 输出流
客户端的s.getInputStream() 连接于服务器s.getOutputStream()
客户端的s.getOutputStream()连接于服务器s.getInputStream()
3) 使用线程处理 网络流
7. Java 反射
1) 反射是Java自我管理(类, 对象)的机制
2) * 可以通过反射机制发现对象的类型 发现类型的方法/属性/构造器
3) * Java 反射 可以创建对象 并 访问任意对象方法和属性等
4) Class 加载
类加载到内存: java 将磁盘类文件加载到内存中,为一个对象(实例)
这个对象是Class的实例, 也就是 这些对象都是Class实例
5)Class 实例代表Java中类型, 基本类型的类型: int.class, long.class
类类型 Class 实例获得如下:
Class cls = String.class;
Class cls = Class.forName("java.lang.String");
Class cls = "abc".getClass();
以上方法获得cls 是同一个对象, 就是String 类内存加载的结果
package javase2.day06.ftp;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* ftp 客户端 可以使用命令 ls pwd get
*/
public class FtpClient {
public static void main(String[] args)
throws IOException{
FtpClient client = new FtpClient();
client.open();
}
public void open() throws IOException{
Socket s = new Socket("localhost", 9000);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//处理客户端对服务器的请求
new RequestProcess(out).start();
//处理服务器的反馈信息
new ResponseProcess(in).start();
}
//处理客户端对服务器的请求
class RequestProcess extends Thread{
OutputStream out;
public RequestProcess(OutputStream out) {
this.out = out;
}
public void run() {
try{
Scanner sc = new Scanner(System.in);
while(true){
String s = sc.nextLine();
IOUtils.println(out, s);
if(s.equals("bye")){
System.exit(0);
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
class ResponseProcess extends Thread{
InputStream in;
public ResponseProcess(InputStream in) {
this.in = in;
}
public void run() {
try{
while(true){
String header = IOUtils.readLine(in);
if(header.startsWith("text,")){
show(header,in);
}else if(header.startsWith("file,")){
save(header, in);
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public void show(String header, InputStream in)
throws IOException {
int n = Integer.parseInt(header.split(",")[1]);
for(int i=0; i<n; i++){
String s = IOUtils.readLine(in);
System.out.println(s);
}
}
public void save(String header, InputStream in)
throws IOException{
File dir = new File("ftp");
if(!dir.exists()){
dir.mkdir();
}
//header: file,10,filename
String[] data = header.split(",");
long length = Long.parseLong(data[1]);
String filename = data[2];
File file = new File(dir, filename);
BufferedOutputStream out =
new BufferedOutputStream(
new FileOutputStream(file));
for(long i=0; i<length; i++){
int b = in.read();
out.write(b);
}
out.close();
}
}
package javase2.day06.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 模拟FTP服务器, 支持命令pwd,ls,get file
*
* 协议: type,length,value TLV格式
*
* 文本: text,5\nline1\nline2\nline3\nline4\nline5\n
* 文件: file,4,filename\n 41 42 43 44
*
* text,5\nline1\nline2\nline3\nline4\nline5\nfile,4,filename\n 41 42 43 44
*/
public class FtpServer {
public static void main(String[] args)
throws IOException{
FtpServer server = new FtpServer();
server.start();
}
public void start() throws IOException{
ServerSocket ss = new ServerSocket(9000);
while(true){
Socket s = ss.accept();
new Agent(s).start();
}
}
class Agent extends Thread{
Socket s;
public Agent(Socket s) {
this.s = s;
}
public void run() {
try{
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
//向客户端发送, 先发协议头,再发送文本行
out.write("text,1\n".getBytes());//协议头
//发送消息内容, 一行文本消息
out.write("欢迎使用FTP演示服务器!\n".getBytes());
out.flush();
while(true){
//读取客户端发送到命令
String cmd = IOUtils.readLine(in).trim();
if("pwd".equals(cmd)){//显示当前目录
pwd(out);
}else if("ls".equals(cmd)){
ls(out);
}else if(cmd.startsWith("get ")){
get(cmd, out);
}else if("bye".equalsIgnoreCase(cmd)){
IOUtils.println(out, "text,1");
IOUtils.println(out, "Bye, Bye!");
s.close();
}else{
out.write("text,1\n".getBytes());//协议头
out.write("只支持pwd,ls,get,bye!\n".getBytes());
out.flush();
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public void pwd(OutputStream out)
throws IOException{
File dir = new File(".");
IOUtils.println(out, "text,1");
IOUtils.println(out, dir.getCanonicalPath());
}
public void ls(OutputStream out)
throws IOException{
File dir = new File(".");
File[] files = dir.listFiles();
IOUtils.println(out, "text,"+files.length);
for (File f : files) {
if(f.isDirectory()){
IOUtils.println(out, "["+f.getName()+"]");
}else{
IOUtils.println(out, f.getName());
}
}
}
public void get(String cmd, OutputStream out)
throws IOException{
//cmd="get filename"
String name = cmd.split("\\s+")[1];
File file = new File(name);
if(! file.exists()){
IOUtils.println(out, "text,1");
IOUtils.println(out, "没有文件呀!"+name);
return;
}
//文件协议头:
IOUtils.println(out,
"file,"+file.length()+","+name);
FileInputStream in =
new FileInputStream(file);
IOUtils.cp(in, out);
out.flush();
in.close();
IOUtils.println(out, "text,1");
IOUtils.println(out, "发送成功:"+name);
}
}
展开全部
TCP 客户端编程
1) 创建Socket 实例, 连接到服务器端, 成功创建s就表示连接到了
服务器
Socket s = new Socket("host", port)
2) 客户端 Socket 与服务器端 Socket 对应, 都包含输入, 输出流
客户端的s.getInputStream() 连接于服务器s.getOutputStream()
客户端的s.getOutputStream()连接于服务器s.getInputStream()
3) 使用线程处理 网络流
1) 创建Socket 实例, 连接到服务器端, 成功创建s就表示连接到了
服务器
Socket s = new Socket("host", port)
2) 客户端 Socket 与服务器端 Socket 对应, 都包含输入, 输出流
客户端的s.getInputStream() 连接于服务器s.getOutputStream()
客户端的s.getOutputStream()连接于服务器s.getInputStream()
3) 使用线程处理 网络流
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
apache ftpserver
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询