整个功能的实现步骤
1.客户端使用本地的字节输入流读取被上传的文件数据 2.客户端使用网络字节输出流,将读取到的文件数据发送给服务端 3.服务端使用网络字节输入流读取客户端发送过来的文件数据 4.服务端使用本地字节输出流将读取到的文件数据写入到指定的服务器本地文件中(例如,保存到目录 upload 下面) 5.服务端使用网络字节输出流,给客户端回写一段文字:“上传成功” 6.客户端使用网络字节输入流,读取服务端返回的数据 7.释放资源
注意: 1.客户端和服务端对本地硬盘进行读写,需要使用自己创建的 IO 流,称为本地流 2.客户端和服务端之间进行数据读写,必须使用 Socket 中提供的 IO 流,称为网络流
客户端的实现步骤
1.创建一个本地字节输入流对象(即 FileInputStream ),构造方法中绑定要读取的数据源 2.创建一个客户端对象(即 Socket 对象),构造方法中绑定 IP 和端口号 3.使用 Socket 对象的方法 getOutputStream,获取网络字节输出流对象 4.使用 FileInputStream 对象的方法 read 读取要上传的文件数据 5.使用网络字节输出流对象的方法 write,将读取到的文件数据发送到服务端 6.使用 Socket 对象的方法 getInputStream 获取网络字节输入流对象 7.使用网络字节输入流对象的方法 read 读取服务端回写的数据 8.释放资源(FileInputStream、Socket)
服务端的实现步骤
1.创建一个服务端对象(即 ServerSocket),并且向系统要指定的端口号 2.使用服务端对象的方法 accept 获取请求的客户端对象(即请求连接的 Socket 对象) 3.使用 Socket 对象的方法 getInputStream 获取网络字节输入流 4.判断服务端的目标目录路径是否存在,若不存在要创建此目录 5.创建一个本地字节输出流对象(即 FileOutputStream),构造方法中要绑定写入数据的目标文件路径 6.使用网络字节输入流的方法 read 读取客户端发送过来的文件数据 7.使用 FileOutputStream 对象的方法 write 将读取到文件数据写入到服务器本地文件中 8.使用 Socket 对象的方法 getOutputStream 获取网络字节输出流对象 9.使用网络字节输出流对象的方法 write 给客户端发送一段文字:文件上传成功! 10.释放资源(FileOutputStream、Socket、ServerSocket)
示例代码
客户端代码:
package priv.lwx.javaex.fileupload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("/Users/liaowenxiong/desktop/test/1.jpeg");
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
byte[] bytes = new byte[1024];
int i = 0;
while ((i = fis.read(bytes)) != -1) {
os.write(bytes, 0, i);
}
socket.shutdownOutput();
InputStream is = socket.getInputStream();
i = is.read(bytes);
System.out.println(new String(bytes, 0, i));
fis.close();
socket.close();
}
}
服务端代码:
package priv.lwx.javaex.fileupload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept();
InputStream is = socket.getInputStream();
File file = new File("/Users/liaowenxiong/desktop/test/upload");
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file + File.separator + "1.jpeg");
byte[] bytes = new byte[1024];
int i = 0;
while ((i = is.read(bytes)) != -1) {
fos.write(bytes, 0, i);
}
OutputStream ops = socket.getOutputStream();
ops.write("文件上传成功!".getBytes());
fos.close();
socket.close();
server.close();
}
}
服务端的升级版本一:
package priv.lwx.javaex.fileupload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TCPServer02 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
InputStream is = socket.getInputStream();
File file = new File("/Users/liaowenxiong/desktop/test/upload");
if (!file.exists()) {
file.mkdirs();
}
String fileName = System.currentTimeMillis() + (new Random().nextInt(9) + 1) + ".jpeg";
FileOutputStream fos = new FileOutputStream(file + File.separator + fileName);
byte[] bytes = new byte[1024];
int i = 0;
while ((i = is.read(bytes)) != -1) {
fos.write(bytes, 0, i);
}
OutputStream ops = socket.getOutputStream();
ops.write("文件上传成功!".getBytes());
fos.close();
socket.close();
}
}
}
服务端的升级版本二:
package priv.lwx.javaex.fileupload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TCPServer03 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
FileOutputStream fos = null;
try {
InputStream is = socket.getInputStream();
File file = new File("/Users/liaowenxiong/desktop/test/upload");
if (!file.exists()) {
file.mkdirs();
}
String fileName = System.currentTimeMillis() + (new Random().nextInt(9) + 1) + ".jpeg";
fos = new FileOutputStream(file + File.separator + fileName);
byte[] bytes = new byte[1024];
int i = 0;
while ((i = is.read(bytes)) != -1) {
fos.write(bytes, 0, i);
}
OutputStream ops = socket.getOutputStream();
ops.write("文件上传成功!".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
|