(6)Socket接收文件 Java

本文描述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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值