小编Jos*_*ion的帖子

WebSockets适用于实时多人游戏吗?

我有兴趣构建一个小型的实时多人游戏,使用HTML5/JavaScript作为客户端,也可能使用Java作为服务器软件.

我稍微调查了一下WebSockets,但看起来我对WebSockets实际上有什么误解.我最初认为WebSockets只是JavaScript处理TCP套接字的方式,就像在Java和其他语言中使用它一样,但似乎必须进行整个握手过程,并且每次传输都包含很多HTTP开销(并且那个案例,对Ajax的好处似乎并不像第一眼那样令人兴奋)?

在一个相关的主题上,为此目的有没有更好的WebSockets替代品(JavaScript中的实时多人游戏)?

javascript multiplayer websocket

41
推荐指数
4
解决办法
3万
查看次数

如何在Angular2中强制刷新Observable服务?

ngOnInit,我的组件获取用户列表,如下所示:

this.userService.getUsers().subscribe(users => {
    this.users = users;
});
Run Code Online (Sandbox Code Playgroud)

userService.getUsers()的实现如下所示:

getUsers() : Observable<UserModel[]> {
    return this.http.get('http://localhost:3000/api/user')
                    .map((res: Response) => <UserModel[]>res.json().result)
                    .catch((error: any) => Observable.throw(error.json().error || 'Internal error occurred'));
}
Run Code Online (Sandbox Code Playgroud)

现在,在另一个组件中,我有一个可以创建新用户的表单.问题是,当我使用第二个组件来创建用户时,第一个组件不知道它应该向后端发出新的GET请求以刷新其用户视图.我怎么能这样说呢?

我知道理想情况下我想跳过那个额外的HTTP GET请求,并且简单地追加客户端已经拥有的数据,当它进行POST以插入数据时,但是我想知道如何在这种情况下完成它无论出于何种原因,这都是不可能的.

rxjs angular

27
推荐指数
1
解决办法
2万
查看次数

使用JavaScript检查字符串是否包含日文字符(包括汉字)

如何检查给定字符串是否包含一个或多个日文字符(由假名和/或汉字组成)?

我在这里看到了一个类似的问题:如何检查变量是否包含中文/日文字符?,我用解决方案来提出这个:

var containsJapanese = string.match(/[\u3400-\u9FBF]/);
Run Code Online (Sandbox Code Playgroud)

然而,这给出了许多误报.

我已经通过脚本遍历整个网页的内容(例如Facebook,Stack Overflow等)来测试它,并标记了应该包含日文文本的div.在这种情况下,大量的div最终会被错误标记.我还测试了该网页包含日文文本,而日本的div那里最终得到与许多错误标记的div正确标记.

javascript regex string

23
推荐指数
1
解决办法
2万
查看次数

使用Rhino解释Java中的JavaScript:暂停/恢复脚本

我正在使用JDK的javax.script.*包.具体来说,我正在使用JavaScript引擎,根据我的阅读,它似乎基于Mozilla开发的名为Rhino的JavaScript-in-Java解释器.

我希望完成的是基本上让我的JavaScript能够在代码中的某个点"暂停"自己(比如说,在函数调用的中途),并且只有在Java允许它执行时才会自行恢复.

为了说明我的意思,想象一下这个JavaScript代码:

function myJSFunction() {
    print("Hello ");
    mysteriousPauseFunction(); // this is the part I'm wondering about.  basically, the script should break here and resume later at Java's discretion...
    // upon reaching this comment, we know now that Java has told JavaScript that it's okay to resume, so the next line will now be executed...
    print("world");
}
Run Code Online (Sandbox Code Playgroud)

如果"暂停"/"破坏"部分涉及绑定Java函数并将其传递给当前ScriptEngine或其他任何东西,那对我来说很酷.我认为这可能涉及到:从Java中暂停JavaScript.

我做了一些谷歌搜索,发现这里的关键字似乎是"延续".据我所知,Rhino只支持解释模式下的延续(与编译模式相比),我看到它是通过将"context"设置为-2来实现的.由于内置的​​JDK ScriptEngine似乎没有提及有关上下文的任何内容(或者我可能缺少它),这是否意味着我必须直接下载并使用Mozilla的Rhino库?

我需要实现这个目标吗?我已经找到关于Rhino延续的有用教程,但在阅读完之后,我不能100%确定这是否能够完成我上面描述的内容.如果这我正在寻找的,那么我的后续问题是关于所提到的"序列化":这是否意味着当我恢复我的脚本时,所有变量都将被取消,除非我将它们序列化?

更新:看起来这可能与Rhino有关.这是我到目前为止在JavaScript中所拥有的内容; 在代码之后,我将解释它的作用......

var end = new Continuation();

function myJSFunction()
{
    print("Hello "); …
Run Code Online (Sandbox Code Playgroud)

javascript java scripting rhino

15
推荐指数
1
解决办法
2883
查看次数

如何阻止Spring MVC阻塞所有其他Servlet?

我正在使用Spring 2.5 MVC并希望添加另一个第三方Servlet.问题是,Spring MVC捕获所有请求,因此Servlet没有得到任何请求.这是一个web.xml片段:

SpringMVC org.springframework.web.servlet.DispatcherServlet 2

<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>  

<servlet>
    <description>This is the servlet needed for cache.type servlet, returns the packed resources</description>
    <display-name>PackServlet</display-name>
    <servlet-name>PackServlet</servlet-name>
   <servlet-class>net.sf.packtag.servlet.PackServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>PackServlet</servlet-name>
    <url-pattern>*.pack</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

应用程序确实需要/*映射,pack:标签(第三方Servlet)确实需要基于文件扩展名的映射.告诉Spring不要处理请求的任何可能性?感谢致敬.

java spring servlets spring-mvc

9
推荐指数
1
解决办法
2926
查看次数

使用boost :: asio中的write()发送原始数据

我最近决定使用boost::asio我的套接字,但现在我遇到了一个问题:文档似乎缺乏.

我想要做的是编写一个函数,它将发送一个包含以下结构的消息:

  • uint16_t操作码所有字节的无符号整数()的2个字节
  • 之后的所有字节(灵活数量)是任何类型的数据(强制转换为void*).该数据将基于操作码进行操作

例如,如果操作码是1,可能定义为OPCODE_LOGIN,那么操作码后面的字节可能包含一个包含登录信息等的字符串.

bool sendMessage(tcp::socket* sock, uint16_t opcode, void* data)
{
    void* fullData = malloc(sizeof(uint16_t) + sizeof(data));
    memcpy(fullData, (void*)opcode, sizeof(opcode));
    memcpy(&fullData + sizeof(uint16_t), data, sizeof(data));
    boost::asio::write(sock, boost::asio::buffer(fullData, sizeof(fullData)));
    // by the way, at this point, is it safe to delete fullData to prevent memory leaks?
    return true;
Run Code Online (Sandbox Code Playgroud)

}

但是,这不会编译.关于写入调用,我得到一个神秘的编译错误:

1>------ Build started: Project: client, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\boost\boost_1_47\boost\asio\impl\write.hpp(46): error C2228: left of '.write_some' must have class/struct/union
1>          type is 'boost::asio::basic_stream_socket<Protocol> …
Run Code Online (Sandbox Code Playgroud)

c++ boost-asio

9
推荐指数
1
解决办法
2万
查看次数

node.js sockets.io每隔约25秒断开连接(与心跳相关)

我正在尝试使用socket.io设置node.js服务器.我看到的问题是我的服务器每25秒断开连接+重新连接客户端.

这是我的服务器代码:

var io = require('socket.io').listen(5876);
io.sockets.on('connection', function (socket)
{
    console.log("New connection established");

    socket.on('disconnect', function()
    {
        console.log("A client has disconnected.");
    });
}
Run Code Online (Sandbox Code Playgroud)

我的客户端使用socket.io.js分发进行连接.据我所知(显然不正确),我需要我的客户端每隔15秒发送一次"心跳"(消息":: 2"),以防止服务器认为连接已死并断开连接.基本上:

<script src="socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:5876');

    socket.on('connect', function(data)
    {
        console.log("Connected to server.");
        setInterval(function() { socket.emit("::2"); console.log("sent heartbeat"); }, 15000); // schedule a heartbeat for every 15 seconds
    });
</script>
Run Code Online (Sandbox Code Playgroud)

但是客户端仍然每隔25秒就会断开连接+重新连接(不包括前25秒的刻度).

node.js服务器控制台日志看起来像这样(可能已经删除了一些早期相同的连接/断开阶段,因为它每25秒回显一次):

New connection established
   debug - emitting heartbeat for client 652791160849839915
   debug - websocket writing 2::
   debug - set heartbeat timeout for client 652791160849839915
   debug …
Run Code Online (Sandbox Code Playgroud)

heartbeat node.js socket.io

8
推荐指数
1
解决办法
1万
查看次数

安全地保持MySQL连接的活动状态

我正在开发一个连接到MySQL服务器的nod​​e.js应用程序。但是,以下内容可能不是特定于node.js的。

当前,我的代码在应用程序启动时初始化一个MySQL连接,然后在每次需要查询时都使用该连接。

我的方法面临的问题是,连接会在一段时间后趋于关闭。我不确定该时间段有多长,但似乎至少需要几个小时。我也不确定是否是由于不活动引起的。

无论如何,我想知道哪种方法可以更好地长期管理MySQL连接。在可能的方法中,我考虑了:

  • 只需在每个查询之前检查一下连接是否仍然有效。如果不是,请在执行查询之前重新连接。

  • 池化MySQL连接。对于一个相当小的应用程序,这会过分杀伤力吗?

  • 定期(每个小时左右)执行查询,以防由于不活动而发生查询。但是,这不能解决由于非活动导致的可能情况。

  • 查询之前/之后连接和断开连接。不好的主意,因为涉及的开销。

如您所想,我倾向于使用前两个选项之一。哪个选项最可靠,最有效?

mysql connection-timeout

6
推荐指数
1
解决办法
2万
查看次数

使用C#Linq解析GML数据到XML

我知道这是非常基本的,并被问了一千次,但由于某种原因,我无法让它工作.

我有一个类似于以下内容的gml文件:

<?xml version='1.0' encoding='UTF-8'?>
<schema
xmlns='http://www.w3.org/2000/10/XMLSchema'
xmlns:gml='http://www.opengis.net/gml'
xmlns:xlink='http://www.w3.org/1999/xlink'
xmlns:xsi='http://www.w3.org/2000/10/XMLSchema-instance'
xsi:schemaLocation='http://www.opengis.net/gml/feature.xsd'>
<gml:Polygon srsName='http://www.opengis.net/gml/srs/epsg.xml#4283'>
 <gml:outerBoundaryIs>
  <gml:LinearRing>
   <gml:coord>
    <gml:X>152.035953</gml:X>
    <gml:Y>-28.2103190007845</gml:Y>
   </gml:coord>
   <gml:coord>
    <gml:X>152.035957</gml:X>
    <gml:Y>-28.2102020007845</gml:Y>
   </gml:coord>
   <gml:coord>
    <gml:X>152.034636</gml:X>
    <gml:Y>-28.2100120007845</gml:Y>
    </gml:coord>
   <gml:coord>
    <gml:X>152.034617</gml:X>
    <gml:Y>-28.2101390007845</gml:Y>
    </gml:coord>
   <gml:coord>
    <gml:X>152.035953</gml:X>
    <gml:Y>-28.2103190007845</gml:Y>
    </gml:coord>
  </gml:LinearRing>
 </gml:outerBoundaryIs>
</gml:Polygon>
</schema>
Run Code Online (Sandbox Code Playgroud)

我需要做的就是从每个gml:coord节点读取X和Y. 我正在使用C#3.0和LINQ,所以它应该很简单,但我尝试的只是返回空结果.

我只在VB中进行了xml解析,所以C#方式对我来说有点陌生.

谢谢,内森

c# xml linq-to-xml

5
推荐指数
1
解决办法
4665
查看次数

在C++中,关于位移和转换数据类型

我最近在Stack Overflow上问了一个关于如何将我的数据从16位整数后跟未定量的void*-cast内存转换为无符号字符的std :: vector的问题,以便使用已知的套接字库作为NetLink使用其签名如下所示的函数来发送原始数据:

void rawSend(const vector<unsigned char>* data);
Run Code Online (Sandbox Code Playgroud)

(供参考,这里是那个问题:将unsigned int +一个字符串转换为unsigned char向量)

这个问题得到了成功的回答,我很感谢那些回应的人.Mike DeSimone回复了一个send_message()函数示例,该函数将数据转换为NetLink接受的格式(std :: vector),如下所示:

void send_message(NLSocket* socket, uint16_t opcode, const void* rawData, size_t rawDataSize)
{
    vector<unsigned char> buffer;
    buffer.reserve(sizeof(uint16_t) + rawDataSize);
    buffer.push_back(opcode >> 8);
    buffer.push_back(opcode & 0xFF);
    const unsigned char* base(reinterpret_cast<const unsigned char*>(rawData));
    buffer.insert(buffer.end(), base, base + rawDataSize);
    socket->rawSend(&buffer);
}
Run Code Online (Sandbox Code Playgroud)

这看起来正是我所需要的,所以我开始编写一个附带的receive_message()函数......

...但是我很尴尬地说我并不完全理解所有的位移和诸如此类的东西,所以我在这里遇到了一堵墙.在我过去近十年编写的所有代码中,我的大部分代码都是使用更高级的语言,而我的其余代码并没有真正调用低级内存操作.

回到编写receive_message()函数的主题,我的起点,如您所想,是NetLink的rawRead()函数,其签名如下所示:

vector<unsigned char>* rawRead(unsigned bufferSize = DEFAULT_BUFFER_SIZE, string* hostFrom = NULL);
Run Code Online (Sandbox Code Playgroud)

看起来我的代码将开始这样的事情:

void receive_message(NLSocket* socket, uint16_t* opcode, const void** rawData)
{
    std::vector<unsigned char, …
Run Code Online (Sandbox Code Playgroud)

c++ sockets bit-manipulation opcode

5
推荐指数
1
解决办法
481
查看次数

用于生成密码哈希的C/C++函数(使用MD5或其他算法)?

我正在寻找一个与PHP的md5()函数相同的C/C++函数 - 传入一个字符串,返回该字符串的单向散列.如果它们是安全的(或更安全的),相当快,理想情况下是单向的,我也会接受除md5()以外的其他算法.

我正在搜索所述函数的原因与我使用PHP的md5()函数的目的相同:在数据库中存储用户密码的单向哈希,而不是用户密码的实际文本(如果是数据库的数据一直受到损害,用户的密码仍然是相对秘密的.

我现在花了大约两个小时搜索.我发现的所有代码都是用于获取文件数据的MD5(而不仅仅是字符串),不能编译,是用于其他编程语言,还是需要整个库(例如Crypto ++,OpenSSL,hashlib ++)来被添加到我的项目中,其中一些非常大(当我想要的只是一个单向字符串哈希函数时,真的有必要吗?).

看到这是一个共同的需求,我假设有人已经写了并提供了我正在寻找的东西..有人能指出我吗?

提前致谢.

c++

2
推荐指数
2
解决办法
3万
查看次数