【问题标题】:Docker on java sockets : java.net.ConnectException: Connection refused (Connection refused)java套接字上的Docker:java.net.ConnectException:连接被拒绝(连接被拒绝)
【发布时间】:2021-01-08 13:16:03
【问题描述】:

我有 2 个 java 文件 Server.java 和 Client.java。两者都在不同的容器中。

DOCKER 文件:我用于服务器的 dockerfile(在名为“Server”的文件夹中)是:

FROM java:8
COPY Server.java /
RUN javac Server.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Server"]

客户端的dockerfile(在名为'Client'的文件夹中)是:

FROM java:8
COPY Client.java /
RUN javac Client.java
EXPOSE 25000
ENTRYPOINT ["java"]
CMD ["Client"]

构建我使用的容器

docker build . (for the client Dockerfile)

docker build . (for the server Dockerfile)

对于我使用的网络设置

docker network create client_server_network

docker run --network-alias server --network client_server_network -it serverimage

docker run --network client_server_network -it clientimage

我在运行客户端映像时遇到的错误是

java.net.ConnectException: Connection refused (Connection refused)

客户端.java

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("192.168.2.5", 25000);
            DataOutputStream dout = new DataOutputStream(s.getOutputStream());
            dout.writeUTF("Hello Server");
            dout.flush();
            dout.close();
            s.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

服务器.java

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(25000);
            Socket s = ss.accept();// establishes connection
            DataInputStream dis = new DataInputStream(s.getInputStream());
            String str = (String) dis.readUTF();
            System.out.println("message= " + str);
            ss.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

我做错了什么?

【问题讨论】:

    标签: java docker sockets networking


    【解决方案1】:

    默认情况下,docker 在容器之间使用自动 DNS 解析。容器可以通过名称或别名相互解析。 (Docker bridge networks)

    在客户端,您明确定义了服务器的 IP 地址: Socket serverSocker = new Socket("192.168.2.5", 25000);.

    Docker 不知道它,而不是使用容器的这个名称或别名: Socket serverSocker = new Socket("server", 25000);

    或者您可以通过环境变量动态传递服务器的主机: Socket serverSocket = new Socket(System.getenv("SERVER_HOST_ENV"), 25000);

    别忘了传递一个环境变量: docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2016-02-25
      • 1970-01-01
      相关资源
      最近更新 更多