引言
🥇距离开学还有38天,我还是没有底气
🥇我对体制内的人的刻板印象好像是表面朴素,暗地敛财手段层出不穷;
案例概述
我们假定C盘为我们的客户端硬盘位置,D盘为服务器端的硬盘;把C盘中的文件传输到D盘。
初步实现
文件上传客户端
实现步骤
1.创建一个Socket对象;
2.使用本地字节输入流(FileInputStream),从本地读取文件;
3.创建网络字节输出流(getOutputStream()),把文件传输到服务器;
4.使用网络字节输入流(getInputStream),从服务器中读取响应信息;
5.释放资源(Socket,本地字节输入流);
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Demo01Client {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\客户端\\高效(六).pdf");
Socket socket=new Socket("127.0.0.1",8888);
OutputStream outputStream = socket.getOutputStream();
int len=0;
byte[] bts=new byte[1024];
while((len=fis.read(bts))!=-1){
outputStream.write(bts,0,len);
}
InputStream inputStream = socket.getInputStream();
int len1=inputStream.read(bts);
System.out.println(new String(bts,0,len1));
fis.close();
socket.close();
}
}
文件上传服务器端
实现步骤
1.创建一个ServerSocket对象,用accept()方法创建一个Socket对象;
2.创建网络字节输入流,把客户端传来的文件读取到服务器;
3.创建本地字节输出流,把服务器上的文件输出到硬盘;
4.使用网络字节输出流,对服务器做出回应;
5.释放资源(ServerSocket,FileOutputStream,Socket)
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo01FileServer {
public static void main(String[] args) throws IOException {
ServerSocket server =new ServerSocket(8888);
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
file.mkdirs();
//判断路径是否存在
byte[] bts=new byte[1024];
int len=0;
FileOutputStream os=new FileOutputStream(file+"\\1.pdf");
while((len=inputStream.read(bts))!=-1){
os.write(bts,0,len);
}
OutputStream outputStream=socket.getOutputStream();
outputStream.write("收到了pdf文件".getBytes());
socket.close();
os.close();
server.close();
}
}
测试结果
你会发现文件是传输成功了,但是两个程序都没有终止,而且控制台也没有输出服务器的回应;
问题分析
解决方法
使用Socket中的shutdownOutout() 方法;
对于TCP套接字,任何先前写入的数据将被发送,随后添加一个TCP的 正常连接终止序列;
案例优化
1.让服务器一直处于运行状态,只要客户端上传文件,服务器就能随时响应;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo01FileServer {
public static void main(String[] args) throws IOException {
ServerSocket server =new ServerSocket(8888);
//服务器不能重复创建,所以在循环外侧
while(true){
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
file.mkdirs();
//判断路径是否存在
byte[] bts=new byte[1024];
int len=0;
FileOutputStream os=new FileOutputStream(file+"\\"+System.currentTimeMillis()+".pdf");
System.out.println("333333333333333333333");
while((len=inputStream.read(bts))!=-1){
os.write(bts,0,len);
}
//用这种方法读取,使效率提高
System.out.println("444444444444444444");
OutputStream outputStream=socket.getOutputStream();
outputStream.write("收到了pdf文件".getBytes());
socket.close();
os.close();
}
//服务器不用关闭了;
}
}
2.利用线程提高服务器效率
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo01FileServer {
public static void main(String[] args) throws IOException {
ServerSocket server =new ServerSocket(8888);
while(true){
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
File file=new File("C:\\Users\\Administrator\\Desktop\\服务端\\高效");
file.mkdirs();
//判断路径是否存在
byte[] bts=new byte[1024];
int len=0;
FileOutputStream os=new FileOutputStream(file+"\\"+System.currentTimeMillis()+".pdf");
while((len=inputStream.read(bts))!=-1){
os.write(bts,0,len);
}
//用这种方法读取,使效率提高
OutputStream outputStream=socket.getOutputStream();
outputStream.write("收到了pdf文件".getBytes());
socket.close();
os.close();
}catch (IOException E){
E.printStackTrace();
}
}
}).start();
}
}
}