приложение в 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 (Слот Сигнала для Отключения)