【JAVA,DAY15-TCP上传文件、下载文件】

TCP上传文件

  • 基本思路:
  • 客户端,客户端想要往服务端上传文件,无法通过自带的socket.read方法先读,在写,因为文件的大小是不确定的,因此你无法指定一个大小为多少的byte【】来存储。
  • 因此我们用到了,一个新的类ByteArrayOutputStream,它有个toByteArray方法,可以创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。可以把缓冲区byteArrayOutputStream.write(bytes,0,len);(即此时该对象的一个区域)中的内容复制到该数组中。其具体代码如下
package InetAddRess;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
// 把字节流放入到字节数组中的方法
public class SteamToByteArray01 {
    public static byte[] streamToByteArray(InputStream stream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] bytes=new byte[1024];
        int len;
        while ((len=stream.read(bytes))!=-1){
            byteArrayOutputStream.write(bytes,0,len);//把bytes中的字节,按照偏移量0-len写到by对象中
        }
        //创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
        //缓冲区:上面读完的数据都在缓冲区放着,下面的方法就是把缓冲区的内容放到数组中
        byte[] array=byteArrayOutputStream.toByteArray();
        byteArrayOutputStream.close();
        return array;
    }
}

然后在利用socket.write方法,通过与服务端建立的连接桥传输过去。

  • 服务端,服务端做的事情比较简单一点,就是接受数据,然后保存到一个位置,首先接受数据,肯定是要用socket.getInputStream创建一个对象来接受,因为只有它能获取客户端传来的数据,然后调用该对象的read方法,每次读一个数据就把它放在数组中,然后创建一个BufferedOutputStream对象用来write即可。

具体代码如下:

package InetAddRess.Test;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("正在等待连接!!!!");
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        String path="D:\\Netease.zip";
        byte[] bytes = new byte[1024];
        int len=0;
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));
        while ((len=inputStream.read(bytes))!=-1)
        {
            bufferedOutputStream.write(bytes,0,len);
        }
        System.out.println("读取完毕。");
        //关闭流 至于关闭什么流 你就看这个流用没用read或者write方法就行了 没用就不用管
        socket.close();
        serverSocket.close();
        bufferedOutputStream.close();
        inputStream.close();
    }
}

客户端

package InetAddRess.Test;

import InetAddRess.SteamToByteArray01;

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        String path="E:\\Netease.zip";
        //socket.getInputStream()只能读socket传来的数据
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));
        byte[] bytes= SteamToByteArray01.streamToByteArray(bufferedInputStream);
        OutputStream outputStream = socket.getOutputStream();
        //outputStream.write必须提前写好东西,然后传给他,这个方法很垃圾
        outputStream.write(bytes);
        System.out.println("传送完毕!断开连接!");
        socket.close();
        outputStream.close();
        bufferedInputStream.close();
    }
}

接受到文件后,服务端返回信息

package InetAddRess.UpdateFile;

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

public class UpdateFileServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器正在等待请求。。。");
        ServerSocket serverSocket = new ServerSocket(8888);
        //如果接收到了请求就返会一个socket对象
        Socket socket = serverSocket.accept();
        //然后就可以读取内容
        InputStream inputStream = socket.getInputStream();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        //先读取数据放到一个地方
        String path="E:\\GTA5线上小助手.exe";
        //InputStream inputStream = socket.getInputStream();
        //socket.getOutputStream(new FileOutputStream(path)
        //在socket中是不允许将字节输出到文件中去的,因此我们要用到之前学的方法
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));
        byte[] bytes = new byte[1024];
        int len=0;
        while ((len=inputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,len);
        }
        System.out.println("读取完毕!");
        socket.shutdownInput();
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("服务端收到程序!!!".getBytes());
        //以前的这种方式是能读取,但是它不能把文件保存在某个地方
        bufferedOutputStream.close();
        bufferedInputStream.close();
        serverSocket.close();
        socket.close();
    }
}

package InetAddRess.UpdateFile;

import InetAddRess.SteamToByteArray01;

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

public class UpDateFileClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(),8888);
        System.out.println("已连接服务端!正在发送数据!");
        String path="D:\\GTA5线上小助手 支持1.58 完全免费 v3.0.2.1.exe";
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));
        //调用下面对象进行读取数据,并存放到字节数组中
        byte[] bytes= SteamToByteArray01.streamToByteArray(bufferedInputStream);
        OutputStream outputStream = socket.getOutputStream();
        //outputStream.write只能输出你写好给他的东西,但不能是一个文件
        outputStream.write(bytes);
        System.out.println("文件上传完毕");
        socket.shutdownOutput();
        InputStream inputStream = socket.getInputStream();
        byte[] bytes1 = new byte[1024];
        int len=0;
        while ((len=inputStream.read(bytes1))!=-1){
            System.out.println(new String(bytes1,0,len));
        }
        bufferedInputStream.close();
        socket.close();
    }
}

TCP 转换流,发送数据

package InetAddRess.HomeWork;

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

public class homework001 {
    public static void main(String[] args) throws IOException {
        //服务端
        System.out.println("正在监听!!!");
        ServerSocket serverSocket = new ServerSocket(5555);
        Socket accept = serverSocket.accept();
        InputStream inputStream = accept.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s = bufferedReader.readLine();
        accept.shutdownInput();

        OutputStream outputStream = accept.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//转换为字符流
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);


        if ("name".equals(s)) {
            //服务端回复xxx
            bufferedWriter.write("你好我是服务端!");
        } else {
            bufferedWriter.write("你真帅!");
        }
        bufferedWriter.flush();
        System.out.println("服务端,结束!");
        bufferedWriter.close();
        bufferedReader.close();
        serverSocket.close();
        accept.close();
    }
}


package InetAddRess.HomeWork;

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

public class homework1 {
    public static void main(String[] args) throws IOException {
        //客户端
        System.out.println("连接完毕!正在发送数据!");
        Socket socket = new Socket(InetAddress.getLocalHost(), 5555);
        OutputStream outputStream = socket.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//转换为字符流
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("name");
        bufferedWriter.flush();
        socket.shutdownOutput();
        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s = bufferedReader.readLine();
        System.out.println(s);
        System.out.println("客户端关闭!");
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
    }
}

字符流读取别往了flush方法

文件下载
加油加油!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keyle777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值