Java 使用socket实现从服务端下载文件[TCP]

这篇和上一篇可以对应上了,使用的都是Socket,TCP。

注意我们这一次是以音频文件做的演示,实际上换成其他二进制文件(如视频、图片)实现代码也完全样。
如果是文本文件,则需要做小部分修改,用字符流来处理,但整体思路都是一致的。

这一次的需求是:

1、客户端请求服务端src目录下的mp3文件,服务端根据请求内容回传相应的文件,客户端保存到本地目录
2、客户端向服务端发送一个歌曲名,服务端返回该歌曲的mp3文件

实现代码如下:

服务端:

package filedownload;

import jdk.nashorn.internal.ir.CallNode;

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

/**
 * TCP实现文件下载
 * 服务端程序,要求接收客户端发来的歌名,返回对应的歌曲mp3文件
 * 同样适用于其他二进制文件如视频、图片等
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器已启动,等待连接中。。。");
        Socket socket = serverSocket.accept();
        System.out.println("连接成功!");

        //接收客户端的请求
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        //一般来说1024个字节大小存一个歌名肯定够了,但如果需要接收一长串的话可以 s += new String(bytes,0,len)
        int len = inputStream.read(bytes);
        String s = new String(bytes,0,len);
        System.out.println("客户想要下载:" + s);


        //根据请求内容向客户端返回相应的文件
        OutputStream outputStream = socket.getOutputStream();
        BufferedInputStream bis;
        if (s.equals("只道寻常")) {
            bis = new BufferedInputStream(new FileInputStream("src/只道寻常.mp3"));
            byte[] data = new byte[1024];
            len = 0;
            while( (len = bis.read(data)) != -1 ) {
                outputStream.write(data, 0, len);
            }
            System.out.println("文件传输完毕。");
            bis.close();

        } else if (s.equals("至少还有你")) {
            bis = new BufferedInputStream(new FileInputStream("src/至少还有你.mp3"));
            byte[] data = new byte[1024];
            len = 0;
            while( (len = bis.read(data)) != -1 ) {
                outputStream.write(data, 0, len);
            }
            System.out.println("文件传输完毕。");
            bis.close();

        } else {
            System.out.println("抱歉我们没有这首歌的资源。");
        }
        socket.shutdownOutput(); //打上结束标记

        //关闭资源
        outputStream.close();
        socket.close();
        serverSocket.close();

    }
}

客户端:

package filedownload;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {

        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8888);
        System.out.println("成功连接到服务器!");

        //接收用户输入,获取用户想要下载的歌曲名称
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您想下载的歌曲名称:");
        String songName = sc.next();

        //给服务器发送歌名
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(songName.getBytes());
        socket.shutdownOutput();
        System.out.println("请求歌曲: " + songName);

        //接收服务器的回应
        InputStream inputStream = socket.getInputStream();
        //开辟本地文件的输出流,以存放从客户端发来的文件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/TestFile/" + songName + ".mp3"));
        byte[] data = new byte[1024];
        int len = 0;
        while ( (len = inputStream.read(data)) != -1 ) {
            bos.write(data, 0, len);
        }
        System.out.println("文件已成功接收!");

        inputStream.close();
        outputStream.close();
        bos.close();
        socket.close();

    }
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值