Docker 和 java 套接字:在容器之间共享数据
Docker and java sockets: Share data between containers
我正在编写客户端-服务器服务,我的服务器在其中向客户端发送文件。
在下面的示例中,我尝试向我的客户端发送文件名列表。
服务器
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--->
我被困在这个问题上好几天了。可能出了什么问题?如果我需要提供任何其他信息,请告诉我。
P.S。在 docker 的服务器端,我将 server 图像设置为主机 newclientSocket = new Socket("server", 4000)
容器有自己的文件系统,不同于主机文件系统。
您的路径 C:\ServerMusicStorage
无法在您的容器中工作,因为此文件不在您的容器中。
或者在创建图像时复制文件。
此外,您的路径是 windows 路径,您应该将其更改为 unix 路径 (/yourdirectory),因为大多数 docker 图像都是 linux 系统
如果您想在 DockerFile 中使用 COPY,只需添加
COPY ServerMusicStorage/ /ServerMusicStorage
但是如果我没记错的话src文件应该是相对路径...
所以你必须把 /ServerMusicStorage 放在你的构建目录附近
我正在编写客户端-服务器服务,我的服务器在其中向客户端发送文件。
在下面的示例中,我尝试向我的客户端发送文件名列表。
服务器
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--->
我被困在这个问题上好几天了。可能出了什么问题?如果我需要提供任何其他信息,请告诉我。
P.S。在 docker 的服务器端,我将 server 图像设置为主机 newclientSocket = new Socket("server", 4000)
容器有自己的文件系统,不同于主机文件系统。
您的路径 C:\ServerMusicStorage
无法在您的容器中工作,因为此文件不在您的容器中。
或者在创建图像时复制文件。
此外,您的路径是 windows 路径,您应该将其更改为 unix 路径 (/yourdirectory),因为大多数 docker 图像都是 linux 系统
如果您想在 DockerFile 中使用 COPY,只需添加
COPY ServerMusicStorage/ /ServerMusicStorage
但是如果我没记错的话src文件应该是相对路径...