【问题标题】:Docker and java sockets: Share data between containersDocker 和 java 套接字:在容器之间共享数据
【发布时间】:2021-04-16 04:52:53
【问题描述】:

我正在编写一个客户端-服务器服务,我的服务器正在向客户端发送文件。

在以下示例中,我尝试将文件名列表发送给我的客户端。

服务器

serverSocket = new ServerSocket(4000);
connsock = serverSocket.accept();
objectOutput = new ObjectOutputStream(connsock.getOutputStream());

List<String> file_names = new ArrayList<String>();
File[] files = new File("C:\\ServerMusicStorage").listFiles();

for (File file : files) {
    if (file.isFile()) {
        file_names.add(file.getName());
    }
}
objectOutput.writeObject(file_names);
objectOutput.flush();

客户

newclientSocket = new Socket("localhost", 4000);
objectInput1 = new ObjectInputStream(newclientSocket.getInputStream());

System.out.println("<---Available files--->");

// get list of files from server
Object file_names = objectInput1.readObject();
file_list = (ArrayList<String>) file_names;
int count = 1;

for (int i = 0; i < file_list.size(); i++) {
    System.out.println(count + ")" + file_list.get(i));
    count++;
}

所以当我在 java NetBeans IDE 上运行我的程序时,它可以按我的意愿运行。我得到了文件

<---Available files--->
1)blank.wav
2)fuark.wav

对于 docker 连接,我创建了一个网络

docker network create client_server_network

我用

运行服务器
docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server

和客户一起

docker run --network client_server_network -it clientimage

虽然客户端-服务器连接通过 docker 容器成功,但当我运行这两个服务时,我没有得到任何输出。

<---Available files--->

我被困在这几天了。可能有什么问题?如果我应该提供任何其他信息,请告诉我。

附:在 docker 的服务器端,我将 server 图像设置为主机 newclientSocket = new Socket("server", 4000)

【问题讨论】:

    标签: java docker sockets stream


    【解决方案1】:

    容器有自己的文件系统,不同于宿主文件系统。 您的路径 C:\ServerMusicStorage 无法在您的容器中工作,因为此文件不在您的容器中。

    你应该看看bindvolume

    或在创建图像时复制文件。

    另外你的路径是 windows 路径,你应该将它更改为 unix 路径 (/yourdirectory),因为大多数 docker 映像都是 linux 系统

    如果您想在 DockerFile 中使用 COPY,只需添加

    COPY ServerMusicStorage/ /ServerMusicStorage 
    

    但如果我没记错的话 src 文件应该是相对路径...related to 所以你必须把 /ServerMusicStorage 放在你的构建目录附近

    【讨论】:

    • 我认为这是一个非常干净的答案。您能否提供一个有关如何将我的 C:\ServerMusicStorage 文件复制到我的图像存储的示例?我认为最好的方法是通过 dockerfile 上的COPY 命令来实现?
    • 我改变了答案
    • 完美,现在我如何访问我的文件?虽然它与您提供的解决方案共享 文件名,但当我尝试查找特定文件时,我得到没有这样的文件File song = new File("serverstorage\\" + requested_file + ".wav\\"); 可能有什么问题?
    • use File song = new File("/serverstorage/" + requested_file + ".wav") 开头的斜线是绝对路径必须的
    猜你喜欢
    • 2022-07-18
    • 1970-01-01
    • 2017-06-04
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多