java 服务器与客户端的文件传输
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 服务器与客户端的文件传输相关的知识,希望对你有一定的参考价值。
用socket实现,是application,不是applet客户端有图形用户界面,服务器可无客户端能获得服务器上的文件列表(用JTree显示),能从服务器上下载并打开文件(txt,java等文本文件),并在客户端的窗口中能编辑并保存该文件,能上传文件到服务器,同时还能和共同连接该服务器的人聊天
可以直接通过流的形式上传或者下载。import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import hkrt.b2b.view.util.Log;
import java.util.Vector;
import zn.ccfccb.util.CCFCCBUtil;
/**
*/
public class CCFCCBSftp
/**
* 连接sftp服务器
*
* @return
*/
public static ChannelSftp connect()
ChannelSftp sftp = null;
try
JSch jsch = new JSch();
jsch.getSession(CCFCCBUtil.CCFCCBHOSTNAME, CCFCCBUtil.CCFCCBHOSTNAME, 22);
Session sshSession = jsch.getSession(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBHOSTNAME, 22);
System.out.println("Session created.");
sshSession.setPassword(CCFCCBUtil.CCFCCBLOGINPASSWORD);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
System.out.println("Session connected.");
System.out.println("Opening Channel.");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("Connected to " + CCFCCBUtil.CCFCCBHOSTNAME + ".");
catch (Exception e)
return sftp;
/**
* 连接sftp服务器
*
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
* @return
*/
public static ChannelSftp connect(String host, int port, String username,
String password)
ChannelSftp sftp = null;
try
JSch jsch = new JSch();
jsch.getSession(CCFCCBUtil.CCFCCBHOSTNAME, CCFCCBUtil.CCFCCBHOSTNAME, 22);
Session sshSession = jsch.getSession(CCFCCBUtil.CCFCCBLOGINNAME, host, port);
System.out.println("Session created.");
sshSession.setPassword(CCFCCBUtil.CCFCCBLOGINPASSWORD);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
System.out.println("Session connected.");
System.out.println("Opening Channel.");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("Connected to " + host + ".");
catch (Exception e)
return sftp;
/**
* 上传文件
*
* @param directory 上传的目录
* @param uploadFile 要上传的文件
* @param sftp
*/
public void upload(String directory, String uploadFile, ChannelSftp sftp)
try
sftp.cd(directory);
File file = new File(uploadFile);
sftp.put(new FileInputStream(file), file.getName());
catch (Exception e)
e.printStackTrace();
/**
* 下载文件
*
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
* @param sftp
* @return
*/
public static String download(String directory, String downloadFile, String saveFile, ChannelSftp sftp)
try
sftp.cd(directory);
File file = new File(saveFile);
FileOutputStream fos = new FileOutputStream(file);
sftp.get(downloadFile, fos);
sftp.disconnect();
fos.close();
catch (Exception e)
Log.info("下载文件过程出错:" + e.getMessage());
return "false";
return "true";
/**
* 删除文件
*
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @param sftp
*/
public void delete(String directory, String deleteFile, ChannelSftp sftp)
try
sftp.cd(directory);
sftp.rm(deleteFile);
catch (Exception e)
/**
* 列出目录下的文件
*
* @param directory 要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException
return sftp.ls(directory);
public static void main(String[] args)
CCFCCBSftp sf = new CCFCCBSftp();
String host = CCFCCBUtil.CCFCCBHOSTNAME;
int port = 22;
String username = CCFCCBUtil.CCFCCBLOGINNAME;
String password = CCFCCBUtil.CCFCCBLOGINPASSWORD;
String directory = "/ccfccb/904999900099/download/";
//String uploadFile = "D:\\tmp\\upload.txt";
String downloadFile = "CCF_904999900099_20150317_0001.zip";
String saveFile = CCFCCBUtil.CCFCCBUploadFilePath + "//" + "CCF_904999900099_20150317_0001.zip";
//String deleteFile = "delete.txt";
ChannelSftp sftp = CCFCCBSftp.connect(host, port, username, password);
//sf.upload(directory, uploadFile, sftp);
CCFCCBSftp.download(directory, downloadFile, saveFile, sftp);
//sf.delete(directory, deleteFile, sftp);
try
sftp.cd(directory);
// sftp.mkdir("ss");
System.out.println("finished");
catch (Exception e)
参考技术A 这个不用FTP就用socket就ok了,我曾写了个FLEX多个用户之间的通信的例题。你可以再服务器短简历一个线程,通过轮训来得到客户端发出的内容。然后在广播给其他的用户。这是多人聊天的功能的思路。至于你要从服务器短获取客户端发来的文件,这个我没写过。但我觉得,是不是应该先传一个标志位过去,是服务器知道是文件来了,然后在接受呢?应为这样的话,可以方便的知道客户端发送上来的数据室什么,这样就方便你的处理。同理客户端下载服务器短的文件也是这样 参考技术B 文件传输还是用ftp协议吧 聊天的话,可以抽象成一个观察者模式,所有客户端注册到服务端,服务端根据ip等唯一标识来分发聊天的消息,这样别说聊天,连群组都捎带实现了哈。 不过,说真的,还是翻书吧。
王道Java网络编程实战详解三TCP完结
@[toc]
一,前言
上篇文章,写了通信协议,服务端与客户端的文本传输原理。
这篇写一下文件的传输原理。
二,文件传输
了解了服务端与客户端的文本传输原理,我们继续进阶到文件传输的原理。
我这里写了俩个文件为:
Tcpwen01.java和Tcpwen02.java,分别是服务端与客户端。
我们这里已传输照片为例子。
2.1,Tcpwen02.java客户端
这里为了方便直接抛出异常了。
1,首先看到是创建一个socket链接。
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9990);
我使用InetAddress类的getByName的方法,开了端口为9990。
,2,创建一个输出流
OutputStream os =socket.getOutputStream();
3,读取文件
我们需要先准备一个照片,我这里直接在java项目文件夹下,所以绝对路径,直接写了文件名。
FileInputStream fis =new FileInputStream(new File("zhu.jpg"));
4,写出文件
写出文件,老套路了,io流。
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1)
os.write(buffer,0,len);
5,通知服务器已经传输完毕
我已经传输完了
socket.shutdownOutput();
6,既然是TCP传输,我们写一个确定,传输的信号,发给服务端,
InputStream InputStream =socket.getInputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
7,老套路,再写一个io输出流。
8,记得关闭资源,保持好习惯。
baos.close();
fis.close();
os.close();
socket.close();
2.2,Tcpwen01.java服务端
和上面一样,为了方便直接抛出异常了。
1,老套路,先创建端口
ServerSocket serverSocket =new ServerSocket(9990);
对应上文,创建9990端口。
2,监听客户端链接
Socket socket=serverSocket.accept();
阻塞式监听,会一直等待用户端链接
3,获取输入流
InputStream is =socket.getInputStream();
4,文件输出流。
继续老套路。
输出文件名为zhu111.jpg
5,通知客户端,接受完毕
OutputStream os = socket.getOutputStream();
os.write("可以了".getBytes());
6,记得关闭资源,保持好习惯。
fos.close();
is.close();
socket.close();
三,附源码
Tcpwen01.java服务端
package tcp02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Tcpwen01
public static void main(String[] args) throws IOException
//1,创建端口
ServerSocket serverSocket =new ServerSocket(9990);
//2,监听客户端链接
Socket socket=serverSocket.accept(); //阻塞式监听,会一直等待用户端链接
//3,获取输入流
InputStream is =socket.getInputStream();
//4,文件输出
FileOutputStream fos =new FileOutputStream(new File("zhu1111.jpg"));
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1)
fos.write(buffer,0,len);
//通知客户端,接受完毕
OutputStream os = socket.getOutputStream();
os.write("可以了".getBytes());
//关闭
fos.close();
is.close();
socket.close();
Tcpwen02.java客户端
package tcp02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Tcpwen02
public static void main(String[] args) throws Exception
//1,创建一个socket链接
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9990);
//2,创建一个输出流
OutputStream os =socket.getOutputStream();
//3.读取文件
FileInputStream fis =new FileInputStream(new File("zhu.jpg"));
//4,写出文件
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1)
os.write(buffer,0,len);
//通知服务器已经传输完毕
//socket.shutdownInput(); //我已经传输完了
socket.shutdownOutput();
//确定
InputStream InputStream =socket.getInputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len1;
while((len1=InputStream.read(buffer2))!=-1)
baos.write(buffer,0,len1);
System.out.println(baos.toString());
//5,关闭资源
baos.close();
fis.close();
os.close();
socket.close();
四,下集预告_UDP传输
下集预告_UDP传输原理。
以上是关于java 服务器与客户端的文件传输的主要内容,如果未能解决你的问题,请参考以下文章