java模拟客户端向服务器上传文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java模拟客户端向服务器上传⽂件
本⽂实例为⼤家分享了java客户端向服务器上传⽂件的具体代码,供⼤家参考,具体内容如下
先来了解⼀下客户端与服务器Tcp通信的基本步骤:
服务器端先启动,然后启动客户端向服务器端发送数据。
服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果。
客户端读取服务器发送的数据
⽂件上传步骤:
客户端使⽤本地字节输⼊流,指定上传数据的数据源。
客户端使⽤⽹络字节输出流,把读取的本地⽂件上传到服务器。
服务器使⽤⽹络字节输⼊流,读取客户端上传的⽂件。
服务器使⽤本地字节输出流,把读取到的⽂件保存到服务器硬盘上。
服务器使⽤⽹络字节输出流,给客户端响应⼀个“上传成功”。
客户端使⽤⽹络字节输⼊流,读取服务器响应的数据。
客户端的代码实现
public class fileClient {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\1.jpg");//创建⼀个本地的输⼊流,⽤于指定上传数据的数据源
Socket socket = new Socket("127.0.0.1",8888);//创建⼀个客户端对象,host是服务器名称或Ip地址
OutputStream os = socket.getOutputStream();//使⽤socket中的⽅法,获取⽹络字节输出流对象
byte[] bytes = new byte[1024];//把本地硬盘的数据通过⽹络字节输出流传递给客户端
int len = 0;
while ((len = fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
socket.shutdownOutput();//为了解决阻塞问题
InputStream is = socket.getInputStream();//使⽤socket中的⽅法,获取⽹络字节输⼊流,⽤于读取客户端的数据
while((len = is.read(bytes))!=-1){//读取客户端的数据进⾏输出
System.out.println(new String(bytes,0,len));
}
socket.close();//关闭流
fis.close();
}
}
服务器端代码实现
public class fileServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);//创建服务器端对象
//while(true){//让服务器⼀直处于运⾏状态,保证客户端可以随时向服务器上传⽂件
new Thread(new Runnable() {//为了提⾼⽂件上传效率,来⼀个客户端开⼀个线程
@Override
public void run() {
try{
Socket socket = serverSocket.accept();//使⽤accept⽅法接收客户端的数据
InputStream is = socket.getInputStream();//创建⽹络字节输⼊流
File file = new File("D:\\upload");//判断服务器硬盘中的⽂件夹是否存在,此⽂件夹⽤于存储客户端上传的内容
if (!file.exists()){//判断服务器端的⽂件夹是否存在
file.mkdirs();
}
String fileName = "\\picture"+System.currentTimeMillis()+new Random().nextInt(99999)+".jpg";//⾃⼰随机⽣成⽂件名,防⽌重复
FileOutputStream fos = new FileOutputStream(file+fileName);//
int len;
byte[] bytes = new byte[1024];
while((len = is.read(bytes))!= -1 ){//将客户端的数据写⼊服务器硬盘中
fos.write(bytes,0,len);
}
OutputStream os = socket.getOutputStream();//向客户端回应
os.write("上传成功".getBytes());
socket.close();
fos.close();
}catch (IOException e){//在这⾥只能使⽤try catch解决异常,因为run⽅法不⽀持抛出异常
System.out.println(e);
}
}
}).start();
//}
}
}
注:在开启多线程的时候,因为run⽅法的⽗类并不⽀持throws解决异常,所以run也不⽀持,只能使⽤try…catch解决异常
解释⼀下为什么在上传数据的时候客户端和服务器会出现阻塞问题以及解决阻塞的⽅法
为什么会出现阻塞?
出现阻塞的根本问题是,客户端从本地硬盘读取⽂件给服务器的时候,因为⽤的是while循环,所以⽂件的结束符-1并没有被读取到服务器,这时上传到服务器的⽂件就没有结束符,服务器把读取到的⽂件保存到服务器硬盘上时就会⼀直执⾏while循环,导致阻塞。
另外还有⼀个阻塞时服务器向客户端响应⽂件时候的阻塞。
解决阻塞问题的⽅法?
阻塞问题的根本原因就是因为在读取的时候没有结束符,⽤ socket.shutdownOutput() 给上传的⽂件⼀个中⽌序列。
API对 shutdownOutput() 的解释:对于 TCP 套接字,任何以前写⼊的数据都将被发送,并且后跟 TCP的正常连接终⽌序列。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。