gpt4 book ai didi

java - 服务器/客户端之间的文件传输

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:57 25 4
gpt4 key购买 nike

我应该为“.thrift”文件定义什么样的服务以便以后在我的程序中使用它?

这个文件传输应该在客户端和服务器之间,并且应该是“部分”。

StreamFileService.thrift:

struct FileChunk {
1: binary data
2: i64 remaining
}

service StreamFileService {
FileChunk getBytes(1:string fileName, 2: i64 offset, 3: i32 size);
}

流文件客户端.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();

}

流文件服务器.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();
}

流文件服务实现:

  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 binar
service 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 结构可以很容易地扩展,如果有必要的话,例如为了返回额外的元数据,比如总大小(特别是如果大小随时间增长/缩小)、剩余字节数、关于数据格式的指示等。您不必这样做,因为如果以后有必要,您可以轻松地扩展接口(interface)。品味问题。

关于java - 服务器/客户端之间的文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com