------- android培训、java培训、期待与您交流! ----------
客户端
package cn.itcast.b_upload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
// 1. 控制台获取用户上传的文件的路径.
File file = getFile();
System.out.println(file);
// 2. 创建客户端Socket.
Socket socket = new Socket("192.168.10.1", 5000);
// 3. 获取客户端socket 的输入和输出流.
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 4. 将客户端文件的名字上传到服务器.
out.write(file.getName().getBytes());
// 5. 读取服务端的返回的消息.
byte[] buffer = new byte[1024];
int len;
len = in.read(buffer);
String mess = new String(buffer, 0, len);
// 6. 根据服务端的响应,判断文件是否存在.
if ("文件存在无需上传".equals(mess)) {
System.out.println(mess + ",客户端程序结束!!!");
socket.close();
return;
} else {
System.out.println(mess);
}
System.out.println("客户端开始上传!!!");
// 7. 在客户端创建字节输入流. 读取客户端的文件.
FileInputStream fis = new FileInputStream(file);
// 8. 客户端字节输入流循环读取.
while ((len = fis.read(buffer)) != -1) {
// 8. 客户端socket 的输出流写出数据.
out.write(buffer, 0, len);
}
// 9. 文件上传完毕,发送结束标记.
socket.shutdownOutput();
// 10. 客户端接收服务器的返回的消息.
len = in.read(buffer);
System.out.println(new String(buffer, 0, len));
// 11. 关闭客户端socket 客户端字节输入流.
fis.close();
socket.close();
}
public static File getFile() throws IOException {
// 1.控制台获取用户需要上传的文件的路径.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("请输入上传文件的路径:");
String filePath = br.readLine();
File file = new File(filePath);
// 2.路径不存在.
if (!file.exists()) {
System.out.println("路径不存在,请重新输入. ");
continue;
}
// 2. 不支持目录.
if (file.isDirectory()) {
System.out.println("暂不支持目录上传,等待升级版!!!");
continue;
}
return file;
}
}
}
服务器
package cn.itcast.b_upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
// 1. 创建服务端.
System.out.println("tcp 服务器启动.准备接收文件");
ServerSocket server = new ServerSocket(5000);
while (true) {
// 2. accept 方法等待客户端连接.
final Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
String ip = socket.getInetAddress().getHostAddress();
System.out.println("客户端:" + ip + "连接了..");
try {
// 3. 获取服务端socket 的输入和输出流.
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024 * 8];
int len;
// 4. 服务接收文件的名字.
len = in.read(buffer);
String fileName = new String(buffer, 0, len);
// 5. 在服务器明确该文件保存的路径...
File dir = new File("e:\\upload");
// 检测该目录是否存在. 如果不存在,必须创建.
if (!dir.exists()) {
dir.mkdir();
}
// 6. 根据客户端上传的文件名,封装为一个File 对象.
File file = new File(dir, fileName);
// 7. 服务器, 检测文件是否存在. 如果存在就不再重复上传.
if (file.exists()) {
out.write("文件存在无需上传".getBytes());
socket.close();
return;
} else {
out.write("文件不存在可以上传".getBytes());
}
System.out.println("服务端开始接收");
// 8. 服务器创建本地的字节输出流. 将socket 读取的数据持久化存储到服务器.
FileOutputStream fos = new FileOutputStream(file);
// 9. 服务器开始接收.
while ((len = in.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("服务器接收完毕!!!");
// 10. 服务器接收完毕,想客户端发送结束的消息.
out.write("服务器成功接收完毕".getBytes());
// 11. 关闭服务端的创建的字节输出流.
fos.close();
} catch (IOException e) {
// e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// e.printStackTrace();
}
System.out.println("客户端:" + ip + "离开了..");
}
}
}).start();
}
}
}