gpt4 book ai didi

javascript - 如何从Java服务器读取JavaScript中的数据?

转载 作者:行者123 更新时间:2023-12-02 10:36:28 25 4
gpt4 key购买 nike

我正在运行一个显示时间的简单服务器,当有人使用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种类型的数据(在服务器中)-各种传感器读取。

最佳答案

tl; dr

根据this Answer,这是用于解析自1970-01-01T00:00Z的epoch reference以来的毫秒数的JavaScript。

var date = new Date( millisecondsSinceEpochReference );


其他建议

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

Java Servlet

无需重新发明Web服务器。发明了 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 container)(例如 Apache TomcatEclipse Jetty)上运行servlet。

如果愿意,可以通过制作 RESTful Web服务来实现。

java.time

您的Java后端使用的是可怕的旧日期时间类,而现代的java.time类已在几年前取代了该类。

如果您坚持要从 epoch reference跟踪时刻作为计数,则以下代码用于获取 milliseconds起的 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" ) ;  


如果将目的地限制为毫秒(而不是 nanoseconds的java.time分辨率),请截断。

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



  2018-11-13T02:18:05.333Z


您可能希望交换该值,如特定地区的人使用的挂钟时间所示(a time zone)。但总的来说,最佳实践是交换 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及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.DateCalendarSimpleDateFormat

现在位于 Joda-Time中的 maintenance mode项目建议迁移到 java.time类。

要了解更多信息,请参见 Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为 JSR 310

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

在哪里获取java.time类?


Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-具有捆绑实现的标准Java API的一部分。


Java 9添加了一些次要功能和修复。

Java SE 6Java SE 7


大多数java.time功能都被反向移植到 ThreeTen-Backport中的Java 6和7。

Android


更高版本的Android捆绑了java.time类的实现。
对于较早的Android(<26), ThreeTenABP项目改编为 ThreeTen-Backport(如上所述)。请参见 How to use ThreeTenABP…



ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuartermore

关于javascript - 如何从Java服务器读取JavaScript中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53260037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com