(6)Socket接收文件 Java

论坛 期权论坛 脚本     
匿名技术用户   2020-12-21 18:01   60   0

本文描述java如何创建网络服务器,并且发送文件给客户端接收。

一、服务端

package serverSocket;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyService {

 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  ServerSocket ser = new ServerSocket(12345);
  Socket sc =  ser.accept();
  System.out.println("连接客户端"+sc.getInetAddress());
  //从sc中获取流,网络IO流
  InputStream in = sc.getInputStream();
  OutputStream out = sc.getOutputStream();
  //为了简化操作,创建过滤流
  ObjectOutputStream oos = new ObjectOutputStream(out);
  ObjectInputStream ois = new ObjectInputStream(in);
  
  File src = new File("E:\\Users\\Long\\Downloads\\JavaDemo\\Upload\\退伍军人就业平台建设方案.docx");
  
  //发送文件名
  oos.writeObject(src.getName());
  System.out.println("向客户端发送文件名:"+src.getName());
  oos.flush();
  //接收客户端已有文件大小
  long overSize = ois.readLong();
  System.out.println("接收客户端文件大小:"+overSize);
  
  if (overSize==src.length()) {
   oos.writeObject("bu");
   oos.flush();
   System.out.println("告诉客户端不发送:");
  }else {
   oos.writeObject("xc");
   oos.flush();
   System.out.println("向客户端发送文件名");
   
   //文件输入流,把文件读取到java中
   InputStream fileStream = new FileInputStream(src);
   
   byte[] bs= new byte[1024*128];//创建1K大小的缓冲区
   
   fileStream.skip(overSize);
   for (int len = 0; (len=fileStream.read(bs))!=-1;) {
    out.write(bs);//写入网络
   }
   System.out.println("文件发送完成!!!");
   fileStream.close();
  }
  

  
  sc.close();
  ser.close();
 }

}

二、客户端

package clientSocket;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;



public class FileClient {

 public static void main(String[] args) throws Exception {
  Socket sc = new Socket("192.168.2.10",12345);
  System.out.println("成功连接到服务器");
  //从sc中获取流,网络IO流
  InputStream in = sc.getInputStream();
  OutputStream out = sc.getOutputStream();
  //为了简化操作,创建过滤流
  ObjectInputStream ois = new ObjectInputStream(in);
  ObjectOutputStream oos =new ObjectOutputStream(out);
  
  //接收文件名
  String fileName = (String) ois.readObject();
  System.out.println("接收文件名:"+fileName);
  
  File xin = new File("E:\\Users\\Long\\Downloads\\JavaDemo\\DownLoad",fileName);
  //告诉服务器文件大小,服务器进行比较
  oos.writeLong(xin.length());
  oos.flush();
  System.out.println("发送已有文件大小给服务端");
  
  //接收服务器响应,xc代表续传,xin重头传,bu不传
  
  String order = (String)ois.readObject();
  System.out.println("读取服务端信息:"+order);
  if("xc".equals(order)) {//断点续传
   OutputStream fileOut = new FileOutputStream(xin,true);
   System.out.println("开始接收文件:"+xin.getAbsolutePath());
   
   int n=0;
   byte[] bs = new byte[1024*128];
   for (int len = 0; (len = in.read(bs))!=-1; n++) {
    fileOut.write(bs,0,len);//从网络读取,写入到文件
   }
   System.out.println("文件接收完成!!!次数="+n);
   fileOut.close();
  }else if ("bu".equals(order)) {
   System.out.println("文件妥妥的,无需下载");
  }
  
  
  
 }

}

三、以上代码使用流程:

1、 创建项目Project,分别为服务端和客户端.

2、将代码中的IP地址更改为自己的IP地址或者相应的IP地址。

3、更改文件路径为实际的文件路径

4、先运行服务端,再运行客户端,即可实现接收文件。

5、如果传送中途中断,从新运行,可以直接再原来基础上传输。

四、可能会遇到的问题

多次点击运行同一个程序,可能会报此错:

Exception in thread "main" java.net.ConnectException: Connection refused: connect

解决办法详见此文:

https://blog.csdn.net/qq331059279/article/details/90347906

五、正常运行的结果

服务端输出:

客户端输出:

如果客户端已经接收过文件,则客户端输出(n=0):

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP