Socket模拟实现简易文件上传

本文介绍了如何通过Java的Socket编程模拟实现文件上传。客户端创建Socket连接,将文件内容写入Socket输出流;服务器端创建ServerSocket监听,接收文件内容并保存到硬盘。注意客户端在完成上传后需关闭OutputStream,且服务端与客户端端口号需一致。
摘要由CSDN通过智能技术生成

Socket模拟实现简易文件上传

目的

通过Socket的字节输入输出模拟从客户端上传文件到服务器并保存到服务器的硬盘上

步骤

模拟客户端
  1. 创建Socket对象
  2. 通过本地字节流将要上传的文件写入到Socket的字节输出流中
  3. 等待客户端接受并返回信息

客户端代码

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

public class client {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1",8888);
        //创建一个本地的文件输入流将要上传的文件写入到Socket的输出流中
        InputStream is = new FileInputStream("2.png");//要上传的文件的路径(这里用的相对路径)
        int len = 0;
        byte[] bs = new byte[1024];
        OutputStream os = socket.getOutputStream();
        while((len = is.read(bs)) != -1){
            os.write(bs,0,len);
        }
        //这点非常重要,如果不关闭,服务器和客户端都会处于一个阻塞状态,导致两边的程序都无法执行完毕
        socket.shutdownOutput();
        //用一个字节输入流获取服务器的返回信息并打印
        InputStream is0 = socket.getInputStream();
        while((len = is0.read(bs)) != -1){
            System.out.println(new String(bs,0,len));
        }
        is.close();
        socket.close();
    }
}

模拟服务器端
  1. 创建SeverSocket对象,等待客户端发送请求
  2. 通过.accept()获取请求的Socket对象
  3. 把请求的Socket中的字节输出流写入到服务器本地的字节输入流中
  4. 将本地的字节输入流写入到硬盘的制定位置
  5. 向客户端发送请数据(“上传成功”)

服务器端代码

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 IOException {
        //创建ServerSocket对象
        ServerSocket sSocket = new ServerSocket(8888);
        //获取请求的Socket对象
        Socket ac = sSocket.accept();
      	//获取请求的Sockte的字节输入流对象(及要上传的文件内容)
        InputStream is = ac.getInputStream();
        int len = 0;
		//创建本地的文件字节输出流来将is中的文件写入到服务的端的硬盘上
        FileOutputStream fs = new FileOutputStream("/Users/onen/upLoad.png");
        byte[] bs = new byte[1024];
        while((len = is.read(bs)) != -1){
            fs.write(bs,0,len);
            System.out.println(len);
        }
        //向Socket对象的输出流传递信息,用于给客户端回复(上传成功)
        OutputStream os = ac.getOutputStream();
        os.write("上传成功!".getBytes());
        ac.close();
        sSocket.close();
    }
}

注意事项

  1. 在客户端必须要在使用完Socket对象的OutPutStream时对其ShoutDown,否则程序将处于阻塞状态并一直无法结束
  2. 运行时需要先启动服务器在启动客户端
  3. 服务端创建的端口号要和客户端创建Socket对象写的端口号一致
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值