Java Программирование сокета - Тайм-аут сокета - PullRequest
0 голосов
/ 21 марта 2020

Я программирую связь между сервером и клиентом. Проблема в том, что иногда , когда сервер отправляет байтовый массив моему клиенту, клиент, кажется, застревает в 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

Я знаю, что есть некоторые аспекты стиля кода, которые я мог бы сделать лучше, но это всего лишь пример проекта.

...