需求
- 需求:把客户端指定的文件上传到服务器
(自己随便写的,有些地方需要优化)
客户端源码
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
//源文件
File Pic = new File("F:\\u盘\\xb_4K.mp4");
Socket socket = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
BufferedInputStream sbis = null;
try {
bis = new BufferedInputStream(new FileInputStream(Pic));
//
socket = new Socket(InetAddress.getByName("192.168.0.106"), 60000);
bos = new BufferedOutputStream(socket.getOutputStream());
//传递文件名称
//注意此处bug,传递过去的是一个绝对路径,因此需要切割
String name = Pic.getName()+"\r\n";
if (name.contains("\\")) {
int i = name.lastIndexOf("\\");
name = name.substring(i);
}
bos.write(name.getBytes());
bos.flush();
//传递数据
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bos.flush();
socket.shutdownOutput();
//接受服务端返回
sbis = new BufferedInputStream(socket.getInputStream());
byte[] buff = new byte[1024];
int read = sbis.read(buff);
String s = new String(buff, 0, read);
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
- 接收客户端传来的文件,并保存到服务器指定的文件夹中。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class PictureTheServer {
public static void main(String[] args) {
String filename = null;
ServerSocket serverSocket = null;
File putFile = null;
try {
//1.创建Socket服务设置监听端口,获取服务端Socket对象
serverSocket = new ServerSocket(60000);
Socket accept = serverSocket.accept();
//2.获取读取流
InputStream is = accept.getInputStream();
//3.获取读取流的第一个字段(第一个字段为文件名称)
BufferedReader read = new BufferedReader(new InputStreamReader(is));
filename = read.readLine();
putFile = new File("E:\\IO测试文件夹\\" + filename);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(putFile));
BufferedInputStream bis = new BufferedInputStream(is);
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bos.flush();
accept.shutdownInput();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()),true);
pw.println("上传成功");
accept.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
多线程改进版
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
class Demo{
public static void main(String[] args) throws IOException {
ServerSocket serverSocket;
serverSocket = new ServerSocket(60000);
while (true) {
//来一个任务就开启一个线程。
new Thread(new ThreadServerPic(serverSocket.accept())).start();
}
}
}
public class ThreadServerPic implements Runnable {
private String fileName = null;
private File putFile = null;
private Socket accept;
public ThreadServerPic(Socket accept) {
this.accept = accept;
}
@Override
public void run() {
try {
InputStream is = accept.getInputStream();
//3.获取读取流的第一个字段(第一个字段为文件名称)
BufferedReader read = new BufferedReader(new InputStreamReader(is));
fileName = read.readLine();
putFile = new File("E:\\IO测试文件夹\\" + fileName);
if (putFile.exists()) {
putFile = new File(putFile.getName() + "(1)");
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(putFile));
BufferedInputStream bis = new BufferedInputStream(is);
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bos.flush();
accept.shutdownInput();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()), true);
pw.println("上传成功");
accept.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}