服务器/客户端之间的文件传输
我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序?
StreamFileService.thrift:
struct FileChunk {1: binary data
2: i64 remaining
}
service StreamFileService {
FileChunk getBytes(1:string fileName, 2: i64 offset, 3: i32 size);
}
StreamFileClient.java:
public class StreamFileClient {private int fileChunkSize = 16;
private String filePath;
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
private void invoke() {
try {
TTransport theClientTransport = new TFramedTransport(new TSocket(
"127.0.0.1", 7911));
TProtocol theProtocol = new TBinaryProtocol(theClientTransport);
StreamFileService.Client theClient = new StreamFileService.Client(
theProtocol);
theClientTransport.open();
filePath = "/home/output/output.pdf";
File theFile2 = new File(filePath);
theFile2.createNewFile();
FileInputStream stream = new FileInputStream(theFile2);
long currentPosition = 0;
FileChannel theFileChannel = stream.getChannel();
boolean again = true;
do {
FileChunk chunk2 = theClient.getBytes(filePath,
currentPosition, fileChunkSize);
currentPosition += fileChunkSize;
theFileChannel.write(chunk2.data);
if (chunk2.remaining == 0)
again = false;
} while (again);
stream.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
StreamFileClient theClient = new StreamFileClient();
theClient.invoke();
}
}
StreamFileServer.java:
public class StreamFileServer {private void start() {
try {
TNonblockingServerTransport theServerSocket = new TNonblockingServerSocket(
7911);
StreamFileService.Processor theProcessor = new StreamFileService.Processor(
new StreamFileServiceImpl());
TServer theServer = new TNonblockingServer(
new TNonblockingServer.Args(theServerSocket)
.processor(theProcessor));
System.out.println("Server starting on port 7911...");
theServer.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
StreamFileServer theFileServer = new StreamFileServer();
theFileServer.start();
}
}
StreamFileServiceImpl:
public class StreamFileServiceImpl implements StreamFileService.Iface {public FileChunk getBytes(String filePath, long offset, int size)
throws TException {
File theFile = new File("/home/input/kl_12.pdf");
FileChunk chunk = new FileChunk();
try {
FileOutputStream stream = new FileOutputStream(theFile);
MappedByteBuffer buffer = stream.getChannel().map(
FileChannel.MapMode.READ_ONLY, offset, size);
chunk.data = buffer;
chunk.remaining = stream.getChannel().size() - offset - size;
stream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return chunk;
}
}
回答:
您的代码对我来说似乎还不错(未经测试),没有太多更改。
怎么样
typedef binary binarservice StreamFileService {
binar getBytes(1:string fileName, 2: i64 offset, 3: i32 size);
i64 getSize(1:string fileName)
}
我还将返回一个保存字节的结构,但这或多或少是我个人的看法。
struct FileChunk { 1: binary data
2: i64 remaining
}
service StreamFileService {
FileChunk getBytes(1:string fileName, 2: i64 offset, 3: i32 size);
}
FileChunk
如果有必要,可以轻松扩展该结构,例如为了返回其他元数据,例如总大小(尤其是该大小随时间增长/缩小),剩余字节,有关数据格式的指示等。您不必这样做,因为如果以后有必要,可以轻松扩展接口。味道的问题。
以上是 服务器/客户端之间的文件传输 的全部内容, 来源链接: utcz.com/qa/404181.html