Я программирую связь между сервером и клиентом. Проблема в том, что иногда , когда сервер отправляет байтовый массив моему клиенту, клиент, кажется, застревает в input.read(activeServers);
Надеюсь, что кто-то может мне помочь.
Класс, отвечающий за связь на сервер:
package de.Jonas.RemoteController.core;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerCommunicator extends Thread {
private String ip;
private int port;
private String message;
public ServerCommunicator(String ip, int port, String message) {
this.ip = ip;
this.port = port;
this.message = message;
}
@Override
public void run() {
try {
Socket clientSocket = new Socket(ip, port);
clientSocket.setSoTimeout(1000);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.println(message);
InputStream input = clientSocket.getInputStream();
if (message.equals("active")) {
byte[] activeServers = new byte[3];
System.out.println("passed1");
input.read(activeServers);
System.out.println("passed2");
for(byte b : activeServers) {
System.out.println(String.valueOf(b));
}
Main.initializeButtons(activeServers);
input.close();
} else {
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String message = in.readLine();
Main.greenStartButton();
switch (message) {
case "ark":
Main.greenArkButton();
break;
case "example":
Main.yellowMinecraftVanillButton();
break;
case "theforest":
Main.greenTheForestButton();
break;
case "alive":
Main.greenStartButton();
break;
}
in.close();
}
out.flush();
out.close();
clientSocket.close();
System.out.println(message);
} catch (IOException e) {
Main.redAllButtons();
}
}
}
Класс, отвечающий за связь на клиенте:
package de.Jonas.ServerManager.core;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.LinkedList;
import de.Jonas.ServerManager.core.ProcessListing.Processes;
public class ClientCommunicator extends Thread {
private Server server;
private Socket clientSocket;
public ClientCommunicator(Server server, Socket clientSocket) {
this.server = server;
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = in.readLine();
if (message != null) {
if (message.equals("active")) {
System.out.println("Sending ...");
OutputStream out = clientSocket.getOutputStream();
out.write(listActiveServers());
out.flush();
out.close();
System.out.println("Active Servers send");
} else {
if (message.startsWith("playing")) {
byte[] playedServers = new byte[server.getServers().length];
String[] servers = message.split(",");
for(int i = 0; i < server.getServers().length; i++) {
for(String s : servers) {
if(server.getServers()[i].equals(s)) {
playedServers[i] = 1;
}
}
}
server.addPlayedServers(playedServers);
}else {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
switch (message) {
case "ark":
//Ausführen des startCommands
break;
case "example":
//Ausführen des startCommands
break;
case "theforest":
//Ausführen des startCommands
break;
default:
System.out.println("Eine unbekannte Nachricht wurde gesendet.");
}
out.println(message);
out.flush();
out.close();
System.out.println(message);
}
}
in.close();
clientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private byte[] listActiveServers() {
byte[] result = new byte[server.getProcessNames().length];
try {
LinkedList<String> processes = Processes.ALL_PROCESSES.listProcesses();
for(int i = 0; i < server.getProcessNames().length; i++) {
for(String p : processes) {
if(p.startsWith(server.getProcessNames()[i])) {
result[i] = 1;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
Пример вывода:
passed1
passed2
1
0
0
active
passed1
passed1
passed1
passed1
passed1
passed1
passed1
passed2
1
0
0
active
Я знаю, что есть некоторые аспекты стиля кода, которые я мог бы сделать лучше, но это всего лишь пример проекта.