我正在使用heroku和android客户端node.jsweb服务器进行websocket.io通信
我想在服务器信息发送到客户端Android系统时收到它,即使Android系统屏幕关闭
所以我基本上是做一个服务,一个套接字。在侦听器上,线程
也确实应用了部分_唤醒_锁定、前台服务、发送通知、每5秒乒乓一次...
当Android的屏幕打开时,我的系统运行良好。
但是在Android屏幕关闭后约30秒,网络连接将断开连接
你能给我一些关于长期运行的web socket服务源代码的例子或者一些关于我的代码的解决方案吗?
谢谢你的阅读。
主要活动
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, "My:Tag");
wakeLock.acquire();
//apply wake_lock etc
(...)
Intent serviceIntent = new Intent(getApplicationContext(),CommunicationService.class);
startService(serviceIntent); //init service
通信服务(扩展服务)
@Override
public int onStartCommand(Intent intent, int flags, int startId){
//start foreground-service
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
Log.d("gd","entering");
notification =
new Notification.Builder(this, CHANNEL_ID)
.setContentTitle("KD SERVICE TEST")
.setContentText("now koda testing" )
.setSmallIcon(R.drawable.ic_android_ex)
.setContentIntent(pendingIntent)
.build();
startForeground(1, notification);
if(webThread == null) {
Log.d("gd","webthread begin");
webThread = new WebThread(url, role, this.handler);
webThread.start();
}
return START_NOT_STICKY; //I tried STICKY, but nothing
类webThread扩展线程:构造函数和运行
在webThread.run中,线程总是每5秒向服务器发送一次“ping ”,当服务器得到“ping”时,总是回答“pong”
在我的意图中,当没有'pong'时,它意味着对应=假,尝试再次套接字.connect()。并且此处理程序来自通信服务。
public WebThread(String get_url, int input_role, android.os.Handler handler){
try {
socket = IO.socket(get_url);
Log.d("gd","socket status: 0 " + socket.connected());
socket.connect();
socket.emit("join",role,"01");
} catch (URISyntaxException e) {
Log.d("gd", "web server enter failed");
e.printStackTrace();
}
web_listener_init();
this.handler = handler;
Log.d("gd","web thread created");
}
@Override
public void run(){
while(true){
if(isInterrupted())
return;
//when connection status is fine, correspond == true.
if(correspond ==false) {
socket.connect();
socket.emit("join", role, "01");
}
Message msg = Message.obtain();
msg.what = STATE_HEARTBEAT;
handler.sendMessage(msg);
correspond = false;
try {
Thread.sleep(5000);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
这是通信服务类中的处理程序。
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
case STATE_HEARTBEAT:
webThread.getSocket().emit("send_ping");
//sendNotification("ping");
break;
case STATE_WEB_MESSAGE_RECEIVED:
String webMessage = msg.obj.toString();
Log.d("gd", "handler received from web: " + webMessage);
if(webMessage.equals("pong")){
webThread.isCorrespond(); // make webThread 's 'correspond' = true
}
});
我正在使用nkzawa Socket.io 图书馆。如果能提供一些建议,我们将不胜感激。
我解决了我的问题。突然断开不是来自服务器/服务/乒乓球。
来自android本身。
如果不对服务类应用wake_lock(paritial_wake_lock),则
服务不维护,即使其服务是前台,或定期通知
我确实只在main active中设置了唤醒锁,它在服务之前运行。
因此,请在服务上应用wake_lock并放置清单!
我在android中保持套接字连接有麻烦。 我在应用程序中使用Socket.IO客户端java库。 屏幕打开时保持插座连接。 但是,如果屏幕关闭,套接字会因ping超时而断开连接。 我该如何解决这个问题? 我像这样打开连接。 这是我的服务器端代码 ping间隔为25秒,超时为60秒。 当android屏幕关闭时,客户端不适用于。其他事件正常工作。 服务器与日志断开连接(ping超时)。
我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前
问题内容: 我敢肯定这是一个简单的问题,但是我不知道socket.io文档在哪里,而http://labs.learnboost.com/socket.io/上的文档并没有真正的帮助。 假设我有一个socket.io http服务器,并写了一个网站来连接它。 我如何为服务器提供保护,以使未经授权的人(未通过网站连接的人)被阻止/丢弃/禁止。 如何在服务器端结束套接字连接?所以如果我有 如何结束套接
我的springboot微服务依赖于AS400 DB2,当服务启动时,它可能会关闭。该服务有一个配置bean,它有autowired的基于JpaRepository的存储库。在启动期间,当DB2关闭时,我得到以下消息:
关闭屏幕盖时 设定关闭屏幕盖时的动作。 标准 关闭屏幕盖时,显示专用的画面。 进入睡眠模式 让主机进入睡眠模式。 提示 若主机处于锁定状态(POWER(电源)/HOLD(固定)按钮滑至下方),即使已选择[进入睡眠模式],主机仍不会在关闭屏幕盖时进入睡眠模式。 屏幕盖关闭时显示的画面 在屏幕盖关闭时按下L/R按钮,即可变更显示的内容。 同时按下L/R按钮 每次同时按下L/R按钮,可交替显示月历/
如果我不关闭套接字: 客户端没有输出。服务器从不发送消息,或者客户端从不接收消息。 有人知道发生这种情况的可能原因吗?客户端使用一个线程接收消息,一个线程发送消息。客户端套接字在主客户端线程中创建,因此接收者和发送者线程使用当前套接字进行通信。 提前谢了。