У меня есть связь клиент-сервер с использованием 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