JAVA SOCKET реализовать отключение после двух записей - PullRequest
0 голосов
/ 22 января 2020

приложение в P C, использующее JAVA io.socket, которое отправит json на серверное устройство ESP8266 по TCP в локальной сети

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

java - клиент, а устройство - сервер, когда устройство прерывает соединение (здесь позволяет использовать Hercules на локальном хосте), программа java не будет замечена, и когда я попробую для записи с outputtreamwriter это не должно вызывать исключения, исключение будет выполнено после, по крайней мере, двух операций записи в сокет после отключения сервера, и две последние записи, которые не были получены сервером, вернутся успешно! в java. Я читал, что другие программисты используют байтовый сигнал, чтобы увидеть, живо ли соединение. та же проблема там тоже. если я отправлю две записи каждые 20 секунд, интервал между ними составит 60 секунд, прежде чем java осознает, что сервер отключен, и если я отправлю каждую 1 секунду, будет много прерываний ATcommand даром.

вот мой код:

    public boolean Write(String data){
    System.out.println("StartSending");
    if(TESocket.Connected)
    {

        Thread write = new Thread(new Runnable() {
            @Override
            public void run() {
                try
                {
                    outputStreamWriter.write(data);
                    outputStreamWriter.flush();
                }
                catch (IOException e)
                {
                    TESocket.Connected=false;
                    System.out.println("Faild");
                    System.out.println(e.getCause());
                }
            }
        });
        write.start();

        return true;
    }
    else
    {
        System.out.println("Not Connected");
        return false;
    }
}

TESocket - это класс, который обрабатывает Socket с помощью Runnable, а Connected является логическим c, поскольку существует только один сокет за раз, вот метод connect

 public boolean  Connect(){
    Thread connect = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket= new Socket("127.0.0.1",Integer.parseInt(port));
                if(socket.isConnected())
                {
                    inputStreamReader  = new InputStreamReader(socket.getInputStream());
                    outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
                    TESocket.Connected=true;
                    System.out.println("Connected");
                }

            } catch (IOException e) {
                System.out.println("Faild to Connect");
                e.printStackTrace();
            }
        }
    });
    connect.start();
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    if(TESocket.Connected)
        return true;
    else
        return false;
}

как меня заметить, если сервер недоступен сразу после отправки записи? или есть событие, чтобы заметить это? может быть какой-нибудь король асинхронного сокета? как это было в QT (Слот Сигнала для Отключения)

1 Ответ

0 голосов
/ 22 января 2020

хорошо. Метод чтения и установка тайм-аута решили эту проблему, благодаря прочтению некоторого поста в режиме чтения, если я все еще подключен и не получил никаких данных, будет выдан тайм-аут, который вернет меня к первому l ie из в то время как l oop

, если я получу данные, я буду больше нуля, какой считыватель прочитает данные и отметит rec = true, чтобы доза последовательности разъединения не имела места

, если я не буду не получает никаких данных, и доза тайм-аута не происходит, rec = false, и исключение не будет выдано, поэтому программа будет отключать рутинную установку тайм-аута до 1 миллисекунды, что делает его в реальном времени (пропорциональным моей работе) при обнаружении крайнего срока

public boolean Read()
{
    if (TESocket.Connected)
    {
        try {
            socket.setSoTimeout(1000);
        } catch (SocketException e) {
            System.out.println("Problem Timeout");
            e.printStackTrace();
        }
        Thread read = new Thread(new Runnable() {
            @Override
            public void run() {
                int i;
                boolean rec=false;
                while (true)
                {
                    char[] reader = new char[250];
                    try {

                            //while(!inputStreamReader.ready());
                            i=inputStreamReader.read(reader);
                            if(i>0) {
                                System.out.println(reader);
                                rec=true;
                            }
                            // Thread.sleep(2500);
                        if(!rec)
                        {
                            System.out.println("Disconnected");
                            TESocket.Connected=false;
                            inputStreamReader.close();
                            outputStreamWriter.close();
                            socket.close();
                            break;
                        }
                        rec=false;

                    }
                    catch (IOException e)
                    {
                        System.out.println("Connected");
                    }
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });
        read.start();
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...