Java Socket Client не получает полные данные от сервера, находясь в контейнере - PullRequest
0 голосов
/ 18 июня 2020

У меня есть связь клиент-сервер с использованием Socket api. Кроме того, имеется локальный сервер MySQL с тестовой базой данных сотрудников. Когда клиент подключается, сервер выполняет некоторый запрос в MySQL, а затем отправляет данные клиенту. Я создал контейнер для клиента, сервера и MySQL отдельно.

  • Сервер
public class Server
{
    private int SERVERPORT;
    static ServerSocket ss = null;
    static Socket s = null;
    static DataInputStream dis = null;
    static PrintStream ps = null;

    Connection conn = null;
    Statement stmt = null;

    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static String DB_URL = "jdbc:mysql://localhost:3306/";
}
    public Server(int port)
   {
            try
            {
                // Create server Socket
                ss = new ServerSocket(SERVERPORT);
                System.out.println("Server started");

                // connect it to client socket
                s = ss.accept();
                System.out.println("Connection established");

                // to send data to the client
                ps = new PrintStream(s.getOutputStream());

            }
            catch(IOException)
            {
                e.printStackTrace();
            }
    }

MySQL запрос

   public void DoSQL(PrintStream ps, String database, String query)
    {
        DB_URL += database;
        try
        {
            Class.forName(JDBC_DRIVER);
            System.out.println("Driver loaded...");

            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("Connected to SQL database...");

            stmt = conn.createStatement();
            System.out.println("Created statement...");

            ResultSet rs = stmt.executeQuery(query);

            System.out.println("Sending data do client...");
            while(rs.next())
            {
                int id = rs.getInt("emp_no");
                String name = rs.getString("first_name");
                String last = rs.getString("last_name");

                // Send data do client
                ps.println("ID: " + id);
                ps.println("First name: " + name);
                ps.println("Last name: " + last);
            }

            rs.close();
            stmt.close();
            conn.close();

            //Exception handlers(...)


            //(...)

        ps.println("[End of data]");

        // close connection
        ps.close();
        ss.close();
        s.close();

        System.out.println("Server closed");
    }
}

  • Клиент
public class Client
{
    static Socket s = null;
    static DataOutputStream dos = null;
    static BufferedReader br = null;

    public Client(String alias, int PORT)
    {
        try
        {
            // Create client Socket
            s = new Socket(alias, PORT);

            // connect it to server socket
            dos = new DataOutputStream(s.getOutputStream());

            // to read data coming from the server
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }

    public void ListenForData() throws IOException
    {
        String str;

        while(!(str = br.readLine()).equals("[End of data]"))
        {
            System.out.println(str);
        }

        // close connection.
        br.close();
        s.close();
    }
}

Скриншоты
https://imgur.com/a/6Btd4sq
https://imgur.com/a/m37r8Ei

Проблема в том, что большую часть времени клиент не получает полные данные (зависает на l oop), пока сервер завершает свою задачу. Это происходит только с контейнерами Docker, на хост-машине Windows работает безупречно.
Что кажется проблемой?

РЕДАКТИРОВАТЬ

Серверный Dockerfile

# Linux image for Java Socket Server
FROM openjdk:8-alpine
WORKDIR /root/socket-server
COPY Server-MySQL.jar /root/socket-server/
EXPOSE 25000
ENTRYPOINT java -cp Server-MySQL.jar com.sql.server.Main

Client Dockerfile

# Linux image for Java Socket Client
FROM openjdk:8-alpine
WORKDIR /root/socket-client
COPY Client-MySQL.jar /root/socket-client/
EXPOSE 25000
ENTRYPOINT java -cp Client-MySQL.jar com.sql.client.Main

Команды для запуска контейнеров:

docker run  --name java-server --network-alias java-server --network sql_network -it java-server
docker run --name java-client --network sql_network -it java-client

...