花了将近两天的时间实现了使用Java Socket 模拟了一个简单的Ftp Server/Client,主要实现了文件上载、下传、删除以及目录浏览等操作,由于时间关系只能后面继续完善,先做一记录。
1、直接上图:
1)Server端的展示图:
2)Client端的展示:
2、核心代码
1)、Server端的ServerSocket
public FtpServer()
{
loadServerInfo();
int i = 0;
try
{
ServerSocket s = new ServerSocket(Integer.parseInt(sInfo.getPort()));
for(;;)
{
Socket incoming = s.accept();
FtpHandler h = new FtpHandler(incoming,i);
h.start();
i++;
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
2)Server端对接收到的客户请求的处理
public void run() // 监听客户端输入的指令
{
try {
out = new DataOutputStream(csocket.getOutputStream()); // 给客户端返回的流
DataInputStream in = new DataInputStream(csocket.getInputStream()); // 客户端发送来的信息
cmd = in.readUTF();
ServerUtil.outLogging(cmd);
cmdArr = cmd.split(" ");
if (cmdArr[0].equals("LINK"))
loginServer();
if (cmdArr[0].equals("DOWN"))
sendFile();
if(cmdArr[0].equals("UPDATE"))
updateFile();
if(cmdArr[0].equals("GETDIR"))
sendCurrentDirList();
if(cmdArr[0].equals("DELETE"))
deleteFile();
if(cmdArr[0].equals("DELETE"))
deleteFile();
csocket.close();
this.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
3)、客户端发送Socket的代码
public void run() {
try {
socket = new Socket(FtpClientJFrame.ip, FtpClientJFrame.port);
in = new DataInputStream(socket.getInputStream()); // 服务器发送回来的消息
out = new DataOutputStream(socket.getOutputStream()); // 发送给服务端的消息
out.writeUTF(FtpClientJFrame.out);
String rs = in.readUTF();
if (rs == "LOGINOK" || rs.equals("LOGINOK")) {
JOptionPane.showMessageDialog(null, "连接成功!", "提示",
JOptionPane.INFORMATION_MESSAGE);
FtpClientMain.cInfo.setCurrentServerPath(in.readUTF());
FtpClientMain.cInfo.setLoginState(true);
FtpClientMain.cInfo.setIpAdd(FtpClientJFrame.ip);
FtpClientMain.cInfo.setPort(FtpClientJFrame.port);
getDirList();
} else if (rs == "LOGINNO" || rs.equals("LOGINNO")) {
JOptionPane.showMessageDialog(null, "用户名或者密码错误!", "提示",
JOptionPane.INFORMATION_MESSAGE);
}
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(null, "未找到对应主机!", "提示",
JOptionPane.INFORMATION_MESSAGE);
} catch (IOException e) {
e.printStackTrace();
}
}
3、Server/Client的状态信息
1)、Server
public class ServerInfo
{
private String ipAdd;
private String port;
private String username;
private String password;
private String pathDir;
private Boolean canUpdate;
private Boolean canDelete;
private Boolean canDownlaod;
public Boolean getCanDelete() {
return canDelete;
}
public void setCanDelete(Boolean canDelete) {
this.canDelete = canDelete;
}
public Boolean getCanDownlaod() {
return canDownlaod;
}
public void setCanDownlaod(Boolean canDownlaod) {
this.canDownlaod = canDownlaod;
}
public Boolean getCanUpdate() {
return canUpdate;
}
public void setCanUpdate(Boolean canUpdate) {
this.canUpdate = canUpdate;
}
public String getIpAdd() {
return ipAdd;
}
public void setIpAdd(String ipAdd) {
this.ipAdd = ipAdd;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPathDir() {
return pathDir;
}
public void setPathDir(String pathDir) {
this.pathDir = pathDir;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
2)、Client
public class ClientInfo {
private String ipAdd;
private int port;
private Boolean loginState = false;
private String localPath = "D:/FTPClient/";
private String currentPath;
private String currentServerPath;
public String getIpAdd() {
return ipAdd;
}
public void setIpAdd(String ipAdd) {
this.ipAdd = ipAdd;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public Boolean getLoginState() {
return loginState;
}
public void setLoginState(Boolean loginState) {
this.loginState = loginState;
}
public String getLocalPath() {
return localPath;
}
public void setLocalPath(String localPath) {
this.localPath = localPath;
}
public String getCurrentPath() {
currentPath = localPath;
return currentPath;
}
public void setCurrentPath(String currentPath) {
this.currentPath = currentPath;
}
public String getCurrentServerPath() {
return currentServerPath;
}
public void setCurrentServerPath(String currentServerPath) {
this.currentServerPath = currentServerPath;
}
4、涉及到的问题
1)、对Stream的操作
(代码见附件)
2)、对FileInputStream、InputStream等的转换,附上从OutPutStream中回去并保存文件的代码。
// 从流中读取内容并保存
private void readAndSave(InputStream is) throws IOException {
String filename = getFileName(is);
int file_len = readInteger(is);
System.out.println("接收文件:" + filename + ",长度:" + file_len);
readAndSave0(is, savePath + filename, file_len);
System.out.println("文件保存成功(" + file_len + "字节)。");
}
private void readAndSave0(InputStream is, String path, int file_len) throws IOException {
FileOutputStream os = getFileOS(path);
readAndWrite(is, os, file_len);
os.close();
}
// 边读边写,直到读取 size 个字节
private void readAndWrite(InputStream is, FileOutputStream os, int size) throws IOException {
byte[] buffer = new byte[4096];
int count = 0;
while (count < size) {
int n = is.read(buffer);
// 这里没有考虑 n = -1 的情况
os.write(buffer, 0, n);
count += n;
}
}
// 读取文件名
private String getFileName(InputStream is) throws IOException {
int name_len = readInteger(is);
byte[] result = new byte[name_len];
is.read(result);
return new String(result);
}
// 读取一个数字
private int readInteger(InputStream is) throws IOException {
byte[] bytes = new byte[4];
is.read(bytes);
return b2i(bytes);
}
// 创建文件并返回输出流
private FileOutputStream getFileOS(String path) throws IOException {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
return new FileOutputStream(file);
}
3)、涉及到对文件(夹)等的操作
(见附件)
5、如何通过模拟的实现去理解Ftp的工作原理
(未完待续)
6、存在的问题
最后,欢迎拍砖。
- 大小: 28.3 KB
- 大小: 22.3 KB
- 大小: 38.8 KB
- 大小: 34.7 KB
分享到:
相关推荐
这是一个用纯Socket和Java标准写成的文件传输软件,早出来这个轮子给大家看一看,不要大家去用,而是去共同学习,更好的用别人造出来的轮子,总之我这个文件传输思路是对的,可能和FTP协议不太吻合(我只用了一个21...
可能包括`Server.java`作为服务器端入口,`Client.java`作为客户端入口,以及一些辅助类来处理命令解析、文件操作等。 在学习和分析这个Demo时,重点应该关注以下几点: - 如何使用Socket进行双向通信。 - 如何设计...
在给出的FTP服务器模拟程序中,`ftpserver.accept()`方法就是等待客户端的连接,`fs=ftpserver.accept();`就创建了一个新的Socket对象`fs`。 对于客户端,Java提供了`Socket`类来进行Socket编程。客户端通常需要...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
- 一个Client类,模拟客户端,建立连接,发送数据,并接收服务器响应。 - 可能还有测试类或脚本,用于启动服务器和客户端,验证通信功能。 5. **编程实现**: 在Java中,可以使用`java.net.ServerSocket`和`java...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
通过Java网络编程中的Socket通信,客户端(Client)与服务器端(Server)建立连接,从而实现数据的双向传输。在C/S架构中,客户端发送请求到服务器,服务器接收请求并执行相应的操作,如屏幕截取、文件传输等,然后...
Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...
本设计采用C/S(Client/Server)结构,客户端负责发起文件传输请求,服务器端负责处理请求并进行文件传输。Java作为开发语言,因其跨平台性和强大的网络编程支持,成为理想的开发工具。 4.2 多线程技术 为提高文件...
最后,虽然压缩包中的“未命名文件夹”没有提供具体代码或文档,但通常在这样的项目中,你会看到服务器端的代码文件(如server.py或server.java)、客户端代码文件(如client.py或client.java)、配置文件(如config...
1. **客户端-服务器通信**:在QQ案例中,客户端(QQ_client)与服务器(QQ_server)之间的通信是整个系统的核心。客户端负责用户界面展示,接收用户输入,如用户名和密码,然后将这些信息发送到服务器进行验证。...
在这个"tcp通信demo程序"中,我们有两个关键组件:client和server端程序,以及可以直接调试的可执行程序,用于模拟TCP的通信过程。 1. **TCP连接建立**: 在TCP通信开始之前,客户端和服务器端需要建立连接,这...