Как читать данные в JavaScript с сервера Java? - PullRequest
0 голосов
/ 12 ноября 2018

Я использую простой сервер, который показывает время, и когда кто-то подключается к нему с помощью telnet \ putty, он может видеть время.

Мне нужно написать код на JavaScript, который читает данные с сервера. как мне это сделать?

это код сервера

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;




class ClientThread extends Thread {

   private final Socket _socket;

   public ClientThread( Socket socket ) {
      System.out.println( "New client" );
      _socket = socket;
      setDaemon( true );
      start();
   }

   @Override
   public void run() {
      try(
         final OutputStream outputFromServer = _socket.getOutputStream();
         final PrintWriter serverPrintOut = new PrintWriter(
            new OutputStreamWriter( outputFromServer, "utf-8" ), true ))
      {
         serverPrintOut.println( "Welcome to time server" );
         for(;;) {
            final long elapsed = System.currentTimeMillis() - MyServer.StartTime;
            serverPrintOut.println( elapsed );
            Thread.sleep( 1000L );
         }
      }
      catch( final InterruptedException ex) {/**/}
      catch( final IOException e ) {
         e.printStackTrace();
      }
   }
}

public class MyServer {

   static Calendar startTime = Calendar.getInstance();
   static long StartTime = System.currentTimeMillis();



   public static void main( String[] args ) throws IOException {
      try( ServerSocket serverSocket = new ServerSocket( 9991 )) {
         for(;;) {
            new ClientThread( serverSocket.accept());
         }
      }
   }
}

это то, что у меня есть в JavaScript

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%--<script type="text/javascript" src="jsocket.js"></script>--%>
    <%--<script type='text/javascript'>--%>
        <%--// Host we are connecting to--%>
        <%--var host = '10.0.0.82';--%>
        <%--// Port we are connecting on--%>
        <%--var port = 9991;--%>

        <%--var socket = new JSocket();--%>

        <%--// When the socket is added the to document--%>
        <%--socket.onReady = function(){--%>
            <%--socket.connect(host, port);--%>
        <%--}--%>

        <%--// Connection attempt finished--%>
        <%--socket.onConnect = function(success, msg){--%>
            <%--if(success){--%>
                <%--// Send something to the socket--%>
                <%--socket.write('Hello world');--%>
            <%--}else{--%>
                <%--alert('Connection to the server could not be estabilished: ' + msg);--%>
            <%--}--%>
        <%--}--%>
        <%--socket.onData = function(data){--%>
            <%--alert('Received from socket: '+data);--%>
        <%--}--%>

        <%--// Setup our socket in the div with the id="socket"--%>
        <%--socket.setup('mySocket');--%>
    <%--</script>--%>
    <script src="socket.io.js"></script>
    <script>
//        var socket = io('http://10.0.0.82:9991');
//        socket.on('connect', function(){});
//        socket.on('event', function(data){});
//        socket.on('disconnect', function(){});


        var socket = io('10.0.0.82:9991');
        socket.on('news', function (data) {
            console.log(data);
            socket.emit('my other event', { my: 'data' });
        });
    </script>
</head>
<body>

</body>
</html>

но когда я запускаю код JavaScript, я получаю сообщение об ошибке «Неверный http резонанс» что я понимаю почему (сервер не http) - но как мне преодолеть это? что будет быстро и легко - изменить JavaScript или сделать сервер http?

  • Я хочу добавить, что окончательный код будет обрабатывать 30 типов данных (на сервере) - все виды показаний датчика.

1 Ответ

0 голосов
/ 13 ноября 2018

ТЛ; др

Согласно этому ответу , здесь приведен JavaScript для анализа количества миллисекунд, начиная с ссылки эпохи 1970-01-01T00: 00Z.

var date = new Date( millisecondsSinceEpochReference );

Дополнительные предложения

В дополнение к коду JavaScript я могу предложить несколько основных предложений: Java-сервлеты, java.time классы и форматы ISO 8601.

Java Servlet

Нет необходимости заново изобретать веб-сервер. Java Servlet Технология была изобретена, чтобы сделать этот вид работы очень простым.

Напишите простое приложение сервлета, которое возвращает желаемую строку. Занимает всего несколько строк кода.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

@WebServlet ( "/now" )
public class NowServlet extends HttpServlet {

    public void doGet ( HttpServletRequest req , HttpServletResponse res )
        throws ServletException, IOException {

        res.setContentType( "text/plain" );
        PrintWriter out = res.getWriter();

        Instant instant = Instant.now();
        String output = instant.toString();

        out.println( output );
    }
}

Затем запустите ваш сервлет на любом сервлет-совместимом сервере ( веб-контейнер ), например Apache Tomcat или Eclipse Jetty .

Если хотите, вы можете сделать это, сделав RESTful веб-сервис.

java.time

Ваш бэкэнд Java использует ужасные старые классы даты и времени, которые были вытеснены годами назад современными java.time классами.

Если вы настаиваете на отслеживании момента как отсчета из ссылки эпохи , здесь приведен код для получения отсчета миллисекунд с 1970-01-01T00: 00Z .

Instant.now().toEpochMilli() 

Но я предлагаю вам обменяться текстом, а не этим простым целым числом. Продолжайте читать.

ISO 8601

При обмене значениями даты и времени в виде текста используйте стандартное форматирование ISO 8601 . Эти форматы практичны и полезны, они разработаны для того, чтобы избежать двусмысленности, и их легко разбирать на машине, а также легко читать людям в разных культурах.

Классы java.time по умолчанию используют эти стандартные форматы при разборе / генерации строк. Поэтому не нужно указывать шаблон форматирования.

Для значения в UTC используйте Instant class.

String output = Instant.now().toString() ;

2018-11-13T02: 16: 19.422836Z

Вы можете разобрать такую ​​строку обратно в объект.

Instant instant = Instant.parse( "2018-11-13T02:16:19.422836Z" ) ;  

Если пункт назначения ограничен миллисекундами вместо java.time разрешение наносекунд , усечь.

String output = 
    Instant
    .now()
    .truncatedTo( ChronoUnit.MILLIS )
    .toString() 
;

2018-11-13T02: 18: 05.333Z

Вы можете хотите обменять значение, как видно на настенном времени, используемом людьми определенного региона ( часовой пояс ). Но, вообще говоря, лучшая практика - обмениваться моментами в UTC .

Для часового пояса используйте класс ZonedDateTime. Метод toString этого класса разумно расширяет стандарт ISO 8601 , добавляя название часового пояса в квадратных скобках.

String output = 
    ZonedDateTime                          // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone).
    .now(                                  // Capture the current moment.
        ZoneId.of( "America/Montreal" )    // Always specify proper zone name in `Continent/Region` format, never 2-4 letter pseudo-zones such as PST, EST, CEST, or IST.
    )                                      // Returns a `ZonedDateTime` object.
    .toString()                            // Generates text in ISO 8601 format extended to append the name of zone in square brackets.

2018-11-12T21: 27: 54.595139-05: 00 [Америка / Монреаль]

Вы можете разобрать такую ​​строку обратно в объект.

ZonedDateTime zdt = ZonedDateTime.parse( "2018-11-12T21:27:54.595139-05:00[America/Montreal]" ) ;

При необходимости обрежьте, как показано выше.


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...