java套接字上的docker:java.net.connectexception:连接被拒绝(连接被拒绝)

kmpatx3s  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(630)

我有两个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);
        }
    }
}

我做错了什么?

vcirk6k6

vcirk6k61#

默认情况下,docker在容器之间使用自动dns解析。容器可以通过名称或别名相互解析(docker桥网络)
在客户端,您显式定义了服务器的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

相关问题