TCP通信的文件上传案列,即便是客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上,即是文件的复制,文件的下载是相同的原理。
实现步骤:
1、客户端使用本地的字节输入流,读取要上传的文件
2、客户端使用网络字节输出流,把读取到的文件上传到服务器
3、服务器使用网络字节输入流 ,读取客户端上传的文件
4、服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上
5、服务器使用网络字节输出流,给客户端回复上传成功
6、客户端使用网络字节输入流,读取服务器回写的数据
7、释放资源
客户端和服务器和本地硬盘进行读写,使用自己创建的字节流对象,即是本地流。
客户端和服务器之间读写,使用Socket中提供的字节流对象,即是网络流。
代码实现:
客户端:
package Demo34.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("E:\\aa.jpg");
//向服务器端发送数据本地读取到的文件
Socket socket = new Socket("127.0.0.1",8888);
OutputStream os = socket.getOutputStream();
int len =0;
byte[] bytes = new byte[1024];
while ((len= fis.read(bytes)) != -1){
os.write(bytes,0,len);
}
//对于TCP套接字,任何以前写入的数据都将被发送 ,并且后跟TCP的正常连接终止序列
//此方法用来禁用此套接字的输出流,即给服务器一个结束标记
socket.shutdownOutput();
//读取服务器端回写的信息
InputStream is = socket.getInputStream();
while ((len = is.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
fis.close();
socket.close();
}
}
服务器端:
package Demo34.FileUpload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
Socket socket = serverSocket.accept();
//使用多线程提高效率
new Thread(new Runnable() {
//父类run 方法没有声明抛出异常,子类重写只能try catch
@Override
public void run() {
try {
//获取网络字节输入流对象
InputStream is = socket.getInputStream();
File file = new File("D:\\upload");
if(!file.exists()){
file.mkdirs();
}
//自定义文件名称
String filename = "file_" + System.currentTimeMillis() + ".jpg";
FileOutputStream fos = new FileOutputStream(file + "\\" + filename);
int len = 0;
byte[] bytes = new byte[1024];
while ((len= is.read(bytes)) != -1){
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
}
}