这篇和上一篇可以对应上了,使用的都是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();
}
}