java网络编程之文件上传至服务器案例

分析

  1. 【客户端】输入流,从硬盘读取文件数据到程序中。
  2. 【客户端】输出流,写出文件数据到服务端。
  3. 【服务端】输入流,读取文件数据到服务端程序。
  4. 【服务端】输出流,写出文件数据到服务器硬盘中。
  5. 【服务端】获取输出流,回写数据。
  6. 【客户端】获取输入流,解析回写数据。

客户端

// 1.创建Socket对象,指定要连接的服务器的ip地址和端口号
// 2.创建字节输入流对象,关联数据源文件路径
// 3.通过Socket对象获得字节输出流对象
// 4.定义一个byte数组,用来存储读取到的字节数据
// 4.定义一个int变量,用来存储读取到的字节个数
// 5.循环读取字节数据
// 6.在循环中,写出字节数据
// 告诉服务器,客户端不会再写数据到连接通道中
// 7.通过Socket获得字节输入流对象
// 8.读取服务器回写的数据
// 9.释放资源

服务端

// 服务端:
// 1.创建ServerSocket对象,指定服务器的端口号
// 循环请求
// 2.调用accept方法接收请求,建立连接,得到Socket对象
// 开启线程处理上传文件的任务
// 3.通过Socket对象获得字节输入流
// 4.创建字节输出流对象,关联目的地文件路径
// 5.定义一个byte数组,用来存储读取到的字节数据
// 5.定义一个int变量,用来存储读取到的字节个数
// 6.循环读取字节数据
// 7.在循环中,写出字节数据
// -在文件上传时,客户端从文件中读不到数据,就会停止发送。
// 但是服务器端不知道客户端停止了,所以会一直等待接收数据。
// 解决办法:在客户端调用socket.shutdownOutput();通知服务器端发送结束了。
// 8.通过Socket获得字节输出流对象

客户端代码

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

public class Client {
    public static void main(String[] args) throws Exception {
        // 客户端:
        // 1.创建Socket对象,指定要连接的服务器的ip地址和端口号
        Socket socket = new Socket("127.0.0.1", 6666);

        // 2.创建字节输入流对象,关联数据源文件路径
        FileInputStream fis = new FileInputStream("文件路径");

        // 3.通过Socket对象获得字节输出流对象
        OutputStream os = socket.getOutputStream();

        // 4.定义一个byte数组,用来存储读取到的字节数据
        byte[] bys = new byte[8192];

        // 4.定义一个int变量,用来存储读取到的字节个数
        int len;

        // 5.循环读取字节数据
        while ((len = fis.read(bys)) != -1) {
            // 6.在循环中,写出字节数据
            os.write(bys, 0, len); // -1
        }

        // 告诉服务器,客户端不会再写数据到连接通道中
        socket.shutdownOutput();

        System.out.println("=====开始接收服务器回写的数据=====");

        // 7.通过Socket获得字节输入流对象
        InputStream is = socket.getInputStream();

        // 8.读取服务器回写的数据
        int len1 = is.read(bys);// 卡
        System.out.println(new String(bys,0,len1));

        // 9.释放资源
        os.close();
        fis.close();

    }
}

服务端代码

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) throws Exception {
        // 1.创建ServerSocket对象,指定服务器端口号
        ServerSocket ss = new ServerSocket(6666);

        // 2.调用accept()方法接收客户端请求,建立连接,返回Socket对象(没有连接成功会一直阻塞)
        Socket socket = ss.accept();

        while (true) {
            // 3.通过返回Socket对象获得字节输入流
            InputStream is = socket.getInputStream();

            // 4.读取客户端写过来的字符串数据
            byte[] bys = new byte[8192];
            int len = is.read(bys);

            // 5.打印输出
            System.out.println("客户端发送过来的数据:" + new String(bys, 0, len));

            // 6.通过返回Socket对象获得字节输出流
            OutputStream os = socket.getOutputStream();

            // 7.写出字符串数据
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入要对客户端说的悄悄话:");
            String msg = sc.next();
            os.write(msg.getBytes());
        }

        // 8.释放资源
        // socket.close();
        // ss.close();
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值