我正在运行一个显示时间的简单服务器,当有人使用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吗?
答案 0 :(得分:1)
根据this Answer,这是JavaScript,用于解析自1970-01-01T00:00Z的epoch reference以来的毫秒数。
var date = new Date( millisecondsSinceEpochReference );
除了JavaScript代码之外,我还可以提供一些主要建议:Java Servlet, java.time 类和ISO 8601格式。
无需重新发明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)上运行servlet,例如Apache Tomcat或Eclipse Jetty。
如果愿意,可以通过制作RESTful网络服务来实现幻想。
您的Java后端使用的是可怕的旧日期时间类,而这些类早已被现代的 java.time 类取代。
如果您坚持要从epoch reference开始跟踪某个时刻,那么以下代码将自milliseconds起获得1970-01-01T00:00Z的计数。
Instant.now().toEpochMilli()
但是我建议您交换文本,而不是仅仅交换整数。继续阅读。
将日期时间值作为文本交换时,请使用标准的ISO 8601格式。这些格式实用且有用,旨在避免歧义,并且易于通过机器解析,也易于人类跨文化阅读。
java.time 类在解析/生成字符串时默认使用这些标准格式。因此,无需指定格式设置模式。
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
您可能希望交换该值,如特定地区的人使用的挂钟时间(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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。