我想在我的Android应用程序中添加一个服务,该应用程序在后台运行,持有WebSocket连接(可能需要几个小时甚至几天),并定期将一些数据发送到服务器.
现在似乎有一堆用于Java的WebSocket库,我不确定应该使用哪一个:
来自GitHub的 TooTallNate/Java-WebSocket描述:用100%Java编写的准系统WebSocket客户端和服务器实现.http://java-websocket.org/ - 这是我在google搜索"android websocket"的第一个结果中链接的.但是,它有很多未解决的问题,尤其是关于SSL连接的问题,目前似乎没有积极维护.
来自GitHub的 koush/AndroidAsync描述:用于android的异步套接字,http(客户端+服务器),websocket和socket.io库.基于nio,而不是线程. - 许多公开问题,但似乎是维持/工作的活动.
项目Tyrus 来自网站的描述:JSR 356:用于WebSocket的Java API - 参考实现 - 这是由Oracle完成的.不确定它是否适用于Android.
来自网站的 Jetty WebSocket客户端API信息:Jetty还提供了一个Jetty WebSocket客户端库,可以更轻松地与WebSocket服务器进行通信. - 再次:不确定它是否适用于Android.
codebutler/android-websockets 来自GitHub的描述: Android的裸网最小websockets(hybi13/RFC)客户端 - 这个用于 schwiz/android-websocket-example,这是StackOverflow问题的接受答案"如何制作Android设备是否在没有唤醒锁定的情况下保持与Internet的TCP连接? "
来自GitHub的 Atmosphere/wasync描述:带有回退的WebSockets传输Node.js,Android和Java的客户端库 http://async-io.org
TakahikoKawasaki/nv-websocket-client 来自GitHub的描述:Java中的高质量WebSocket客户端实现.
square/okhttp
来自GitHub的描述:适用于Android和Java应用程序的HTTP + SPDY客户端.http://square.github.io/okhttp/
-它有一个Websocket模块.正如 scorpiodawg所提到的,OkHttp自3.5版以来就内置了websocket支持.
来自GitHub的 firebase/TubeSock说明:用Java实现的WebSocket客户端库
Autobahn | Android(GitHub) 网站描述:Autobahn | Android是一个用于Java/Android的开源网络库,由Autobahn项目创建,实现WebSocket协议和Web应用程序消息传递协议(WAMP),用于创建本机移动WebSocket/WAMP客户端.- cloudsurfin指出,这不支持wss.
此外,Android …
我试图围绕redux,react-redux和redux-form进行包装.
我已经设置了一个商店并添加了redux-form的reducer.我的表单组件如下所示:
登录表格
import React, {Component, PropTypes} from 'react'
import { reduxForm } from 'redux-form'
import { login } from '../../actions/authActions'
const fields = ['username', 'password'];
class LoginForm extends Component {
onSubmit (formData, dispatch) {
dispatch(login(formData))
}
render() {
const {
fields: { username, password },
handleSubmit,
submitting
} = this.props;
return (
<form onSubmit={handleSubmit(this.onSubmit)}>
<input type="username" placeholder="Username / Email address" {...username} />
<input type="password" placeholder="Password" {...password} />
<input type="submit" disabled={submitting} value="Login" />
</form> …
Run Code Online (Sandbox Code Playgroud) 我读到我需要将 ICACHE_RAM_ATTR 宏添加到中断服务例程 (ISR) 以及在我的 ESP8266 Arduino 代码中从那里调用的每个函数,以防止随机崩溃。我还找到了对宏 ICACHE_RAM_ATTR 的作用的解释,尽管我不确定该解释是否适用于 Espressif ESP8266 SDK,也适用于 ESP8266 上的 Arduino。我不明白为什么我需要将宏添加到 ISR。
第一个问题:为什么我需要将 ICACHE_RAM_ATTR 宏添加到 ISR 以及从那里调用的所有函数?
下一个问题是,如果我强制内联从 ISR 调用的函数会发生什么:
inline void doStuff() __attribute__((__always_inline__)) { // <-- necessary to add ICACHE_RAM_ATTR here?
// no more function calls here
}
void ICACHE_RAM_ATTR handleInterrupt() {
doStuff();
}
Run Code Online (Sandbox Code Playgroud)
第二个问题:我是否需要将 ICACHE_RAM_ATTR 宏添加到强制内联的函数中?
我正在寻找一种通用方法来获取Node.js中已安装的npm包的(绝对)根路径.
我知道require.resolve
,但这将给我一个入口点(主模块的路径)而不是包的根路径.
以bootstrap-sass
作为一个例子.假设它在本地安装在项目文件夹中C:\dev\my-project
.然后我正在寻找的是C:\dev\my-project\node_modules\bootstrap-sass
.require.resolve('bootstrap-sass')
会回来的C:\dev\my-project\node_modules\bootstrap-sass\assets\javascripts\bootstrap.js
.
我可以想到几种方法如何获取包的根路径:
var packageRoot = path.resolve('node_modules/bootstrap-sass');
console.log(packageRoot);
Run Code Online (Sandbox Code Playgroud)
这适用于本地安装在node_modules
文件夹中的软件包.但是,如果我在子文件夹中,我需要解决../node_modules/bootstrap-sass
,并且使用更多嵌套文件夹会变得更复杂.此外,这不适用于全局安装的模块.
var packageRoot = require.resolve('bootstrap-sass')
.match(/^.*[\/\\]node_modules[\/\\][^\/\\]*/)[0];
console.log(packageRoot);
Run Code Online (Sandbox Code Playgroud)
这适用于安装在node_modules
文件夹中的本地和全局模块.正则表达式将匹配最后一个node_modules
路径元素以及以下路径元素的所有内容.但是,如果将包的入口点设置为另一个包(例如,"main": "./node_modules/sub-package"
in package.json
),则会失败.
var escapeStringRegexp = require('escape-string-regexp');
/**
* Get the root path of a npm package installed in node_modules.
* @param {string} packageName The name of the package.
* @returns {string} Root path of the …
Run Code Online (Sandbox Code Playgroud) 这就是我想要做的:
到目前为止我得到了什么:
在Java方面:
String msg = "Test message";
// generate keypair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(512);
KeyPair keyPair = keyGen.generateKeyPair();
// generate signature
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(keyPair.getPrivate(), SecureRandom.getInstance("SHA1PRNG"));
signature.update(msg.getBytes());
byte[] sigBytes = signature.sign();
// send message, signature and public key to php script
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(uploadNum + 1);
nameValuePairs.add(new BasicNameValuePair("msg", msg));
nameValuePairs.add(new BasicNameValuePair("signature", Base64.encodeToString(sigBytes,
Base64.DEFAULT)));
nameValuePairs.add(new BasicNameValuePair("pubkey", Base64.encodeToString(keyPair
.getPublic().getEncoded(), Base64.DEFAULT)));
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(UPLOAD_SCRIPT);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse …
Run Code Online (Sandbox Code Playgroud) 我认为描述我的问题的最简单方法是举一个例子:
class Enclosing {
private ObjectOfInterest o = new ObjectOfInterest();
public void registerEventListener() {
EventEmitter.onEvent(() -> {
// Need to access 'o' here, while 'this' is not important.
o.yeeha();
});
}
}
Run Code Online (Sandbox Code Playgroud)
lambda 表达式是否包含对其实例的隐式引用Enclosing
?如果是这样,我该如何避免这种情况以避免内存泄漏?我需要访问o
事件侦听器,但不需要访问封闭的实例。
顺便说一句,我发现了这个问题“ Java8 lambda 是否像匿名类一样维护对其封闭实例的引用? ”,但我不清楚 lambda 表达式何时被认为“不从封闭实例捕获成员”。此外,接受的答案中引用的文档声明自己已过时。
我需要在 32 位 ARM 系统(它的 QNAP NAS,CPU:Annapurna Labs Alpine AL-314)上的 Docker 容器中安装支持 uuid-ossp 的 PostgreSQL 9.6.9。
我找到了arm32v6/postgres图像并安装了arm32v6/postgres:9.6.9-alpine
. 这工作顺利,但缺少 postgresql-contrib 包。据我了解,我需要安装 postgresql-contrib 才能获得 uuid-ossp 支持。
我在容器中打开了一个 CLI 并尝试:
# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/armhf/APKINDEX.tar.gz
v3.7.0-215-g16971064c0 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]
v3.7.0-207-gac61833f9b [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]
OK: 8879 distinct packages available
# apk add postgresql-contrib=9.6.9-r0
ERROR: unsatisfiable constraints:
postgresql-contrib-10.4-r0:
breaks: world[postgresql-contrib=9.6.9-r0]
Run Code Online (Sandbox Code Playgroud)
如何安装正确版本的 postgresql-contrib?或者我可以在 PostgreSQL 9.6.9 中使用 postgresql-contrib-10.4-r0 吗?