最简单的java客服端-向服务端发送文件的方法

文章介绍了两种Java文件传输方法。第一种通过PrintWriter和BufferedReader实现,但不推荐,因为每次读取一行就发送一次可能导致丢包。第二种推荐使用字节数组,效率更高,先读取整个文件再一次性发送。
摘要由CSDN通过智能技术生成

导言

此篇文章,带来最简单的文件发送,第一种方式不推荐。

指定文件格式:new PrintWriter(new FileWriter())的方法比较低效,不能指定文件编码,为了指定文件编码我们可以:

PrintWriter FileStorageAddress=new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(“Target File Address”),“UTF-8”)));

的方式去指定。
**

第一种

服务端:

import java.net.*;
import java.io.*;
public class ServerInfoObtainExec{
    public static void main(String[] ServerInfoObtainExec)throws Exception{
        ServerSocket CreateServerAddress=new ServerSocket(1030);
        Socket ObtainOtherOfInfoPoint=CreateServerAddress.accept();
        //开始监听
        BufferedReader PortInfoStorageStream=new BufferedReader(new InputStreamReader(ObtainOtherOfInfoPoint.getInputStream()));
        //建立文件接收
        PrintWriter FileStorageAddress=new PrintWriter(new OutputStreamWriter(new FileOutputStream("Target File Address")),true);
        //建立文件行的放置地址
        String RemoteInputOfInfo=null;
        while((RemoteInputOfInfo=PortInfoStorageStream.readLine())!=null){
            if(RemoteInputOfInfo.equals("endLaunch")){break;}
            FileStorageAddress.println(RemoteInputOfInfo);
        }
        //第一时间判断是否被发送端请求停止
        PrintWriter ReturnUserOfEndInfo=new PrintWriter(ObtainOtherOfInfoPoint.getOutputStream(),true);
        ReturnUserOfEndInfo.println("Launch Of Info Complete Obtain !");
        //接受完的信息
        ReturnUserOfEndInfo.close();
        CreateServerAddress.close();
        PortInfoStorageStream.close();
        //将资源停止占用并且关闭
    }
}

然后时客户端:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ClientLaunchExec{
    public static void main(String[] ClientInfoLaunch)throws Exception{
        Socket RemoteOrderTargetAddress=new Socket("192.168.0.118",1030);

        BufferedReader LoadWantLaunchOfLocalFile=new BufferedReader(new FileReader("Want Launch Of File Address"));
        //要发送的文件地址
        PrintWriter LaunchFileToServer=new PrintWriter(RemoteOrderTargetAddress.getOutputStream(),true);
        //建立发送
        String LaunchAreaOfInfo=null;
        while((LaunchAreaOfInfo=LoadWantLaunchOfLocalFile.readLine())!=null){
            LaunchFileToServer.println(LaunchAreaOfInfo);
        }
        //发送每一行

        LaunchFileToServer.println("endLaunch");
        RemoteOrderTargetAddress.shutdownOutput();
        //发送完时要求接收端停止
        BufferedReader ObtainRemoteOfEndInfo=new BufferedReader(new InputStreamReader(RemoteOrderTargetAddress.getInputStream()));
        System.out.println(ObtainRemoteOfEndInfo.readLine());
        //返回完结信息
        RemoteOrderTargetAddress.close();
        LoadWantLaunchOfLocalFile.close();
        //将资源停止占用并且关闭
    }
}

**

第二种

也是我推荐的字节数组方式,这一种是新手阶段最简单的了

服务端

        ServerSocket CreateServerAddress=new ServerSocket(1030);
        Socket DataActive=CreateServerAddress.accept();
        //如果有人连接了
        InputStream Data=DataActive.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] Buffer_DATA = new byte[1024];

        int NUM_DATA_LENGTH;
        while((NUM_DATA_LENGTH = Data.read(Buffer_DATA)) != -1) {
            byteArrayOutputStream.write(Buffer_DATA, 0, NUM_DATA_LENGTH);
        }

        byteArrayOutputStream.flush();
        
        //保存到本地
        FileOutputStream O=new FileOutputStream("路径");
        O.write(byteArrayOutputStream.toByteArray());
        O.close();

客户端

        String Path="本地文件路径";
        //读取本地文件
        FileInputStream obtainData = new FileInputStream(Path);
        byte[] StorageDataHome = new byte[(int)(new File(Path)).length()];
        ByteArrayOutputStream RETURN_DATA = new ByteArrayOutputStream();

        int StorageByte;
        while((StorageByte = obtainData.read(StorageDataHome)) > 0) {
            RETURN_DATA.write(StorageDataHome, 0, StorageByte);
            RETURN_DATA.flush();
        }

        obtainData.close();

        Socket RemoteOrderTargetAddress=new Socket("192.168.0.118",1030);
        RemoteOrderTargetAddress.shutdownOutput();
        //获取输出流
        OutputStream Obtain=RemoteOrderTargetAddress.getOutputStream();
        Obtain.write(RETURN_DATA.toByteArray());
        Obtain.close();

第二种的解释

名称作用
ServerSocket服务器构建
accept当有人进入时就停止阻塞
getInputStream获取输入流
new File(Path)).length()只是为了获取字节数推荐->obtainData.available()
read读取
write写入流
flush刷新流
close退出文件,不这样会有作用
toByteArrayByteArrayOutputStream自带的API转化为字节数组
getInputStream获取输入流

第一种的解释

名称作用
BufferedReader字符缓冲流-文中只是进行读取
PrintWriter对Socket的输出流的封装
readLine读取一行
println发送一行字符串到服务器
shutdownOutput服务器端读取数据不堵塞
InputStreamReader高效读
OutputStreamWriter高效写

为啥不推荐这种方法

因为在每读取一行就发送一次低效,发送太快很有可能会丢包,导致内容不齐全,发送时间拉长。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AtomicJun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值