您的位置:首页 > 其它

使用 Thrift 进行文件传输

2017-07-25 14:03 295 查看
这里简单展现一下 Thrift 的文件传输功能

一 . 设计 Thrift 的接口定义

新建 Thrift
接口定义文件 Interface.thrift , 作为客户端和服务端进行通信说明,里面内容如下 :  

// -------------------------------------------------------------------- File
struct FileData
{
1:required string   name,                   // 文件名字
2:required binary   buff,                   // 文件数据
}

// -------------------------------------------------------------------- Service

service FileInfoExtractService
{
bool uploadFile(1:FileData filedata);       // 文件解析函数
}


命令行切换到 Interface.thrift 文件所在目录,执行> thrift.exe -gen java Interface.thrift , 生成文件 FileData.java 和 FileService.java , 这两个文件在 Thrift 的 Server 端 和 Client 端都会被用上。

二 . 建立 Thrift 的 Client 端项目

1. Client 项目包含 3 个文件:除了步骤一中生成的 FileData.java 和 FileService.java 之外,新建一个 App.java 文件作为程序入口

2. Client 项目中 FileData.java 和 FileService.java 的具体代码由 Thrift 生成,这里略

3. Client 项目中 App.java 的代码如下:

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;

public class App
{
/**
* 类内测试 main 函数
* */
public static void main(String[] args)
{
// 测试文件路径
String filePath = "C:\\Users\\jiangmengya\\Desktop\\1.jpg";

// 构造文件数据
byte[] bytes = toByteArray(filePath);
FileData fileData = new FileData();
fileData.name = filePath;
fileData.buff = ByteBuffer.wrap(bytes);

// 构造Thrift客户端,发起请求
try
{
TSocket socket = new TSocket("localhost", 12345);
socket.setSocketTimeout(60 * 1000);
TFramedTransport framedTransport = new TFramedTransport(socket);
framedTransport.open();
TBinaryProtocol binaryProtocol = new TBinaryProtocol(framedTransport);
FileService.Client client = new FileService.Client(binaryProtocol);
client.uploadFile(fileData);
}
catch (Exception x)
{
x.printStackTrace();
}
}

/**
* 文件转化为字节数组
* */
private static byte[] toByteArray(String filePath){
byte[] buffer = null;
try {
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return buffer;
}
}


三. 建立 Thrift 的 Server 端项目

1. Server 项目包含 4 个文件:除了步骤一中生成的 FileData.java 和 FileService.java 之外,新建一个 App.java 文件作为程序入口, 新建一个 FileServiceImpl.java 文件来对 Thrift 服务进行具体的实现

2. Server 项目中 FileServiceImpl.java 的代码如下:

import org.apache.thrift.TException;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

public class FileServiceImpl implements FileService.Iface
{
@Override
public boolean uploadFile(FileData filedata) throws TException
{
System.out.println("uploadFile function has been called.");

// 写到文件
String filePath = "C:\\Users\\jiangmengya\\Desktop\\2.jpg";
try
{
java.io.File file = new java.io.File(filePath);
FileOutputStream fos = new FileOutputStream(file);
FileChannel channel = fos.getChannel();
channel.write(filedata.buff);
channel.close();
}
catch (Exception x)
{
x.printStackTrace();
return false;
}
return true;
}
}


3. Server 项目中 App.java 的代码如下:

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadedSelectorServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TNonblockingServerTransport;
import org.apache.thrift.transport.TTransportFactory;

public class App
{
public static void main(String[] args)
{
try
{
// 创建非阻塞的 Transport
TNonblockingServerTransport serverSocket = new TNonblockingServerSocket(12345);

// 创建 Processor
TProcessor processor = new FileService.Processor(new FileServiceImpl());

// 创建 transport factory , Nonblocking 使用 TFramedTransport
TTransportFactory transportFactory = new TFramedTransport.Factory();

// 创建 protocol factory
TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();

// 创建 arguments
TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverSocket);
tArgs.processor(processor);
tArgs.transportFactory(transportFactory);
tArgs.protocolFactory(protocolFactory);

// 创建 server
TServer server = new TThreadedSelectorServer(tArgs);

// 启动 server
server.serve();
}
catch (Exception x)
{
x.printStackTrace();
}
}
}


四. 运行项目

1. 运行 Server 项目 App 

2. 运行 Client 项目 App

3. 输出:

uploadFile function has been called. 

(同时,Client 指定的图片 1.jpg 也会被拷贝传输到 Server 指定的路径下成为 2.jpg)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: