Java常见应用——Socket(文件)(二)

上一篇通过Socket,服务端和客户端进行了简单的交流。
在这一篇中,将进行文件的传输。也就是文件下载。

服务端

因为服务端会一直开着,开着的同时会有很多客户端过来连接进行文件的下载。因此在服务端开启线程。(客户端每发一条请求,服务端都有对应的一条线程进行处理)

package socket2;

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

public class MyServer {
	public static void main(String[] args) throws IOException {
		//绑定服务的端口,ip:为本机Ip
		//暴漏了一个 服务,该服务的地址: 本机ip:9999
		ServerSocket server = new ServerSocket(9999);
		while(true) {
			Socket socket =  server.accept() ;
			//下载的线程
//			MyDownload download = new MyDownload(socket) ;
//			//Runnable->Thread
//			Thread downLoadThread = new Thread(download);
//			downLoadThread.start();
			//这句等于上面几句
			 new Thread(new MyDownload(socket)).start(); 
		}
	}
}

MyDownload

在上一篇中,使用简单的字符串进行了简单的沟通,但是这次是文件,并不存于内存当中,而是存在于磁盘,因此在进行文件传输的时候,需要把文件通过读取文件的输入流放入内存中。

package socket2;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

//处理下载的线程
public class MyDownload  implements Runnable{

	private Socket socket ;
	public MyDownload(Socket socket) {
		this.socket = socket ;
	}
	@Override
	public void run() {//线程要做什么事! -下载
		try {
			System.out.println("与客户端连接成功!");
			
			//服务端向客户端发送消息 Output
			OutputStream out = socket.getOutputStream() ;
			
			File file  = new File("E:\\msdia80.dll");
			//将此文件 从硬盘 读入到内存
			InputStream fileIn = new FileInputStream(file) ;
			byte[] fileBytes = new byte[1000] ; //定义 每次发送的文件大小
			int len = -1 ;
			//发送(因为 文件较大,不能一次发送完毕,因此需要通过循环来 分次发送)
			while( (len=fileIn.read(fileBytes)) !=-1   ) {
				out.write(fileBytes,0,len);
			}
			
			fileIn.close();
			out.close();
			socket.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}

}

客户端

接收的是文件,因此需要输出流把接收到的文件切片放回磁盘。
输入流读取,输出流写回磁盘

package socket2;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		//客户端 连接Server发布的服务
		Socket socket = new Socket("192.168.1.254",9999);//此ip地址是另一台的电脑的ip地址
		
		//接受服务端发送的消息 InputStream
		InputStream in = socket.getInputStream() ;
		

		byte[] bs = new byte[1000] ;//接受每次发来的文件切片(100byte)
		int len = -1 ;
		OutputStream fileOut = new FileOutputStream("e:\\a.dll") ;
		while( (len =in.read(bs))!=-1 ) {
			fileOut.write(bs,0,len);
		}
		System.out.println("下载成功!");
		

		fileOut.close();
//		out.close();
		in.close();
		socket.close();
	}
	
}

现在尽管,服务端和客户端处于两台电脑,也能通过代码运行进行文件传输了。

最后附上文件复制代码

package socket2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class CopyFile {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int date = 0;
		System.out.print("请输入您要拷贝的源文件:");
		String file1 = input.next();
		System.out.print("请输入您要拷贝的目标位置:");
		String file2 = input.next();
		try {
			FileInputStream fis = new FileInputStream(file1);
			FileOutputStream fos = new FileOutputStream(file2);
			while ((date = fis.read()) != -1) {// 读取文件
				fos.write(date);
			}
			fis.close();
			fos.close();
			System.out.println("拷贝成功!");
		} catch (FileNotFoundException e) {
			System.out.println("源文件未找到!");
		} catch (IOException ex) {
			System.out.println(ex.toString());
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值