当前位置: 首页 > 面试题库 >

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

公孙鸿才
2023-03-14
问题内容

我应该为“ .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 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如果有必要,可以轻松扩展该结构,例如为了返回其他元数据,例如总大小(尤其是该大小随时间增长/缩小),剩余字节,有关数据格式的指示等。您不必这样做,因为如果以后有必要,可以轻松扩展接口。味道的问题。



 类似资料:
  • 问题内容: 简而言之,我有一个独立的ES主实例和一个在我的Java应用程序中创建的客户端节点。如果在客户端节点之前启动了独立ES实例,则客户端节点会正确发现独立ES实例。 我面临的问题是-如果由于某种原因,客户端节点在独立ES实例之前启动,我会看到“ MasterNotDiscoveredException”,这也是可预期的。但是,即使启动独立的ES实例后,我仍然会看到相同的异常。我应该更改一些配

  • 问题内容: 我用Node.js运行一个简单的http服务器: 我的index.html文件: 现在,我想在我的index.html文件中打印服务器端变量:temp。但是我不知道该怎么做。 也许有人可以帮助我从服务器到客户端交换变量。 问题答案: 正如您可以在@WebServer的答案中看到的那样,节点中有多种模板引擎。 我想给你一个使用其中一个的例子-EJS: 首先安装它: server.js:

  • 问题内容: 我正在尝试在服务器和客户端之间进行文件传输,但是工作非常糟糕。基本上需要发生的是: 1)客户端将txt文件发送到服务器(我称为“ quotidiani.txt”) 2)服务器将其保存在另一个txt文件中(“ receive.txt”) 3)服务器运行脚本上对其进行修改并以其他名称保存(“ output.txt”)的脚本 。4)服务器将文件发送回客户端,客户端以相同的名称(final.t

  • 本文向大家介绍java模拟客户端向服务器上传文件,包括了java模拟客户端向服务器上传文件的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java客户端向服务器上传文件的具体代码,供大家参考,具体内容如下 先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据。 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果。

  • 本文向大家介绍Java实现文件上传服务器和客户端,包括了Java实现文件上传服务器和客户端的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下 文件上传服务器端: 文件上传客户端: 本文已被整理到了《Java上传操作技巧汇总》,欢迎大家学习阅读。  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐

  • 问题内容: 这个问题已经在这里有了答案 : 通过套接字进行Java多文件传输 (2个答案) 4年前关闭。 我已经实现了简单的TCP服务器和TCP客户端类,可以将消息从客户端发送到服务器,并且消息将在服务器端转换为大写,但是如何实现从服务器到客户端的文件传输以及从客户端上载文件到服务器。以下代码是我得到的。 TCPClient.java } TCPServer.java } 因此,首先将执行TCPS