网络编程上传与下载代码示例

上传(客户端示例代码)

package com.qfedu.days08_06.upload;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadTCPFileCilent {
    public static void main(String[] args) throws Exception {

        //客户端连接服务端
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);

        String filePath = "f:\\gs.jpg";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));

        //bytes就是filePath对应的字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //通过socket获取到输出流,将bytes的数据发送到服务器
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes);//将文件对应的字节数组,写入到数据通道
        bis.close();
        socket.shutdownOutput();//设置写入数据的结束标记

        //接收从服务端回复的信息
        InputStream inputStream = socket.getInputStream();
        String s = StreamUtils.streamToString(inputStream);
        System.out.println(s);



        //关闭流
        inputStream.close();
        bos.close();
        socket.close();
    }

}

上传(服务器示例代码)

package com.qfedu.days08_06.upload;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadTCPFileServer {
    public static void main(String[] args) throws Exception {

        //设定一个端口8888
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器在端口8888进行监听...");
        //等待连接
        Socket socket = serverSocket.accept();

        //读取客户端发送的数据,通过Socket得到输入流
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //将得到的bytes,放入到一个指定的路径,将会得到一个文件
        String destPath = "f:\\book.jpg";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
        bos.write(bytes);
        bos.close();

        //向客户端回复与"已收到信息",通过socket获得输出流(字符)
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("收到图片");
        bw.flush();
        socket.shutdownOutput();//设置写入结束标记



        //关闭其他资源
        bw.close();
        bis.close();
        socket.close();
        serverSocket.close();



    }
}

(读写流的工具包,使用上传与下载时,调用此包StreamUtils即可,作用是减少代码量)

package com.qfedu.days08_06.upload;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 此类用于演示关于流的读写方法
 *
 */
public class StreamUtils {
	/**
	 * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
	 * @param is
	 * @return
	 * @throws Exception
	 */
	public static byte[] streamToByteArray(InputStream is) throws Exception{
		ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
		byte[] b = new byte[1024];//字节数组
		int len;
		while((len=is.read(b))!=-1){//循环读取
			bos.write(b, 0, len);//把读取到的数据,写入bos	
		}
		byte[] array = bos.toByteArray();//然后将bos 转成字节数组
		bos.close();
		return array;
	}
	/**
	 * 功能:将InputStream转换成String
	 * @param is
	 * @return
	 * @throws Exception
	 */
	
	public static String streamToString(InputStream is) throws Exception{
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder builder= new StringBuilder();
		String line;
		while((line=reader.readLine())!=null){
			builder.append(line+"\r\n");
		}
		return builder.toString();
		
	}

}

下载(客户端)

package com.qfedu.days08_06.download;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client_ {
    public static void main(String[] args) throws Exception {

        //1.接收用户输入,指定下载的文件名
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入需要下载的文件名:");
        String downFileName = scanner.next();

        //2.客户端连接服务器,准备发送
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        //3.获取和Socket相关联的输出流
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(downFileName.getBytes());
        //4.设置写入结束的标志
        socket.shutdownOutput();
        //5.读取服务端返回的数据(字节数据)
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bis);

        //6.得到一个输出流,将bytes写入磁盘中
        String filePath = "e:\\"+downFileName+".mp4";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        bos.write(bytes);

        //7.关闭流
        bis.close();
        bos.close();
        outputStream.close();
        socket.close();

        System.out.println("客户端下载完毕");



    }
}

下载(服务端)

package com.qfedu.days08_06.download;

import com.sun.corba.se.spi.activation.Server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server_{
    public static void main(String[] args) throws Exception {
        //监听9999端口,
        System.out.println("服务端在9999端口正在监听...");
        ServerSocket serverSocket = new ServerSocket(9999);
        //等待客户端连接,
        Socket socket = serverSocket.accept();
        //读取客户端发送要下载的文件
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        String downLoadFileName = "";
        while((len = inputStream.read(bytes))!=-1){
            downLoadFileName+=new String(bytes,0,len);

        }
        System.out.println("客户端需要下载的名字:"+downLoadFileName);


        String resFileName = "";
        if("arts".equals(downLoadFileName)){
            resFileName = "f:\\arts.mp4";
        }else {
            resFileName = "f:\\class.mp4";
        }
        //创建一个输入流,用于读取文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));

        //使用StreamUtils,读取文件到到一个字节数组
        byte[] bytes1 = StreamUtils.streamToByteArray(bis);

        //得到Socket关联的输出流
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        //写入数据,返回到数据通道
        bos.write(bytes1);
        socket.shutdownOutput();

        //关闭流
        bis.close();
//        bos.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出");



    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值