网路编程---文件上传案例

IO流相关的案例:

客户端上传文件给服务器,服务器回写信息给客户

思路:

输出方-->硬盘里文件写入到内存,内存连接另一个用户的内存

接收方-->接收发送对象的文件到内存中,内存写入硬盘

客户端:

1、创建客户端对象Socket,指定需要连接的服务器ip地址和端口号

2、创建字节输入流,关联数据源文件路径

3、通过Socket对象获得字节输出流,关联连接通道

4、定义一个byte数组,存储读取到的字节数据

5、定义int变量,存储读取到的字节个数

6、写字节数据

7、关闭流,释放资源

服务器:

1、创建Serversocket对象,指定服努器的端口号

2、创建Serversocket对象,指定服努器的端口号

3、通过Socket对象获得字节输入流,关联连按通道

4、创建字节输出流对象,关联目的地文件踏径

5、定义一个byte数组,用来存储读取到的字节数据

6、定义-个int变量,用来存储读取到的字节个数

7、写字节数据

8、关闭流,释放资涯

注意:我是一台电脑操作所以关联的服务器地址是自己的设置的127.0.0.1,有需要可以自行

优化:1:文件名自动生成不重复  
           2:服务器只能接收客户端上传一次文件---->改成服务器循环接收
           3:效率问题---->目前是单线程会影响效率,改成多线程

 客户端1发送文件

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

public class Client {
    //需求:客户端传文件给服务器
    /*优化 1:文件名自动生成不重复  
           2:服务器只能接收客户端上传一次文件---->改成服务器循环接收
           3:效率问题---->目前是单线程会影响效率,改成多线程
    */
    public static void main(String[] args) throws Exception {
        //创建socket对象,指定需要关联的服务器的ip地址和端口号
        Socket socket = new Socket("127.0.0.1", 9999);

        //创建文件字节输入流对象,关联数据源文件路径
        FileInputStream file1 = new FileInputStream("day0806\\Client\\mm.jpg");

        //通过socket对象创建字节输出流对象关联连接通道
        OutputStream op = socket.getOutputStream();

        //创建一个byte数组,用来存储读取的字节数据
        byte[] by1 = new byte[8192];

        //创建一个变量用来存储读取到的字节个数
        int b;

        //循环读取字节数据
        while ((b = file1.read(by1)) != -1) {
            //写字节数据
            op.write(by1,0,b);
        }
        //禁用通过socket获得的输出流
        socket.shutdownOutput();
        //通过socket获取字节输入流,并关联连接通道
        InputStream in = socket.getInputStream();
        int read = in.read(by1);
        System.out.println(new String(by1, 0, read));

        //关闭流
        socket.close();
        file1.close();
    }


    }

 服务器


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

public class Server {
    public static void main(String[] args) throws Exception {
        //创建ServerSocket对象,指定服务器端口
        ServerSocket ser = new ServerSocket(9999);
        //创建while循环,在连接之前,如果在连接之后会使一个连接无限循环,不停
        while (true) {
            //接收请求创建连接,调用accept方法
            Socket acc = ser.accept();//阻塞
            //创建多线程使得传输大文件也可以连接其他客户端
            new Thread(new Runnable() {
                @Override
                public void run() {
                    FileOutputStream file1 = null;
                    InputStream in = null;
                    try {

                        //使用ServerSocket创建文件字节输入流对象
                        in = acc.getInputStream();

                        //创建文件字节输出流对象,接收文件
                        file1 = new FileOutputStream("day0806\\Server\\" + System.currentTimeMillis() + "mmcop.jpg");
                        System.out.println("服务器开始接收文件。。。");
                        //接收文件
                        //创建一个字节数组存储读取到的字节
                        byte[] byt = new byte[8192];
                        //定义一个变量存储读取到的字节个数
                        int b;
                        //循环读取字节数据
                        while ((b = in.read(byt)) != -1) {

                            file1.write(byt, 0, b);
                        }
                        System.out.println("文件接收完毕。。。");
                        //回写socket对象获得字节输出流,关联连接通道
                        OutputStream out = acc.getOutputStream();

                        out.write("文件上传成功".getBytes());


                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    } finally {
                        //关闭流
                        //ser.close();
                        try {
                            file1.close();
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
                        try {
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                }
            }).start();


        }


    }
}

客户端2发送文件

package demo7_文件上传案例3;

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

public class Client2 {
    //需求:客户端传文件给服务器
    public static void main(String[] args) throws Exception {
        //创建socket对象,指定需要关联的服务器的ip地址和端口号
        Socket socket = new Socket("127.0.0.1", 9999);

        //创建文件字节输入流对象,关联数据源文件路径
        FileInputStream file1 = new FileInputStream("day0806\\Client2\\mm.jpg");

        //通过socket对象创建字节输出流对象关联连接通道
        OutputStream op = socket.getOutputStream();

        //创建一个byte数组,用来存储读取的字节数据
        byte[] by1 = new byte[8192];

        //创建一个变量用来存储读取到的字节个数
        int b;

        //循环读取字节数据
        while ((b = file1.read(by1)) != -1) {
            //写字节数据
            op.write(by1,0,b);
        }
        //禁用通过socket获得的输出流
        socket.shutdownOutput();
        //通过socket获取字节输入流,并关联连接通道
        InputStream in = socket.getInputStream();
        int read = in.read(by1);
        System.out.println(new String(by1, 0, read));

        //关闭流
        socket.close();
        file1.close();
    }


    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值