如何从Java服务器读取JavaScript数据



我正在运行一个显示时间的简单服务器,当有人使用telnet\puty连接到它时,他可以看到时间。

我需要用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种类型的数据(在服务器中)——所有类型的传感器读取

tl;dr

根据这个答案,这里是用于解析自1970-01-01T00:00Z的epoch引用以来的毫秒计数的JavaScript。

var date = new Date( millisecondsSinceEpochReference );

其他建议

除了JavaScript代码之外,我还可以提供一些主要建议:Java Servlet、Java.time类和ISO 8601格式。

Java Servlet

没有必要重新发明网络服务器。Java Servlet技术的发明使这类工作变得非常简单。

编写一个简单的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 );
}
}

然后在任何与servlet兼容的服务器(web容器)上运行servlet,如ApacheTomcat或EclipseJetty。

如果你愿意的话,你可以通过制作RESTful web服务来获得灵感。

java.time

您的Java后端正在使用糟糕的旧日期时间类,这些类在几年前被现代的Java.time类所取代。

如果您坚持将时刻作为历元引用的计数进行跟踪,以下是获取1970-01-01T00:00Z以来毫秒计数的代码。

Instant.now().toEpochMilli() 

但我建议你交换文本,而不仅仅是这个整数。继续阅读。

ISO 8601

将日期时间值交换为文本时,请使用标准ISO 8601格式。这些格式实用且有用,旨在避免歧义,易于机器解析,也易于跨文化的人类阅读。

在解析/生成字符串时,java.time类默认使用这些标准格式。因此,无需指定格式化模式。

对于UTC中的值,请使用Instant类。

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方法通过将时区名称附加在方括号中,明智地扩展了ISO8601标准。

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框架构建在Java8及更高版本中。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

现在处于维护模式的JodaTime项目建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获得java.time类?

  • Java SE 8Java SE 9Java SE 10爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
  • Android
    • java.time类的Android捆绑包的后续版本
    • 对于早期的Android(<26),ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

相关内容

  • 没有找到相关文章

最新更新