- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开发的系统包括:Android Mobile上的socket服务器和PC上的socket客户端。为了检查与客户端的连接,我每 1 秒从服务器发送一个 ""
字符。
但有时,我会遇到异常(exception):
java.net.SocketException: sendto failed: EPIPE (Broken pipe)
at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
at libcore.io.IoBridge.sendto(IoBridge.java:475)
at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
at java.io.OutputStream.write(OutputStream.java:82)
at com.foxconn.cnsbgit.mobileterminal.MainActivity$ServerThread.run(MainActivity.jaa:527)
at java.lang.Thread.run(Thread.java:856)
Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
at libcore.io.Posix.sendtoBytes(Native Method)
at libcore.io.Posix.sendto(Posix.java:151)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
at libcore.io.IoBridge.sendto(IoBridge.java:473)
... 6 more
用于检查连接的发送Thread
如下:
while (true) {
if (client != null) {
try {
client.getOutputStream().write(" ".getBytes()); // Get exception when sending character
Thread.sleep(1000);
mHandler.post(new Runnable() {
@Override
public void run() {
txtConnectionStatus.setText(R.string.smoConnectOK);
}
});
} catch (Exception e) {
e.printStackTrace(); // Get exception at here
mHandler.post(new Runnable() {
@Override
public void run() {
if !txtConnectionStatus.getText().toString().contains("FAIL")) {
txtConnectionStatus.setText(R.string.connectionFailString);
}
}
});
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
更新:然后我输入并将数据发送给客户端。心跳和数据同时发送会导致连接丢失吗? :
public class SendDataThread implements Runnable {
@Override
public void run() {
try {
if (client != null) {
sendDataStream = client.getOutputStream();
sendDataStream.write(dataSend); //dataSend is a byte array
sendDataStream.flush();
mHandler.post(new Runnable() {
@Override
public void run() {
edtCommand.selectAll();
}
});
}
} catch (final Exception e) {
mHandler.post(new Runnable() {
@Override
public void run() {
txtRec.setText(e.toString());
}
});
}
}
}
最佳答案
当 Android 保持空闲时,设备会锁定,然后进入深度 sleep 模式。在深度 sleep 模式下,Android 系统会关闭现有的网络连接,例如 TCP 或 UDP。如果您的应用程序连接到服务器,它将失去与服务器的连接,并尝试根据为客户端配置的重新连接尝试方法重新连接。但是,如果您的应用程序是服务器,则所有客户端都将失去与服务器的连接,并且您必须在服务器中再次启动套接字并尝试从客户端再次连接。
对于移动设备来说,长时间保持 TCP 连接打开可能不是一个好的选择,因为 TCP 连接不能与进入休眠状态的计算机很好地交互。问题场景如下:当您的应用程序运行时,您的 Android 用户将其 Android 设备置于 sleep 状态,然后远程用户的程序(或 TCP 连接另一端的任何程序)通过 TCP 流发送一些数据。远程用户的程序永远不会从 Android 设备返回任何 ACK,因为 Android 设备当然处于 sleep 状态,因此远程设备的 TCP 堆栈假设它发送的 TCP 数据包一定已经丢失,并且它通过增加超时时间来响应,减小其 TCP 窗口大小(也称为一次允许传输的 TCP 数据包数量),并重新发送 TCP 数据包。但Android设备仍然处于 sleep 状态,因此同样的事情再次发生。结果是,几分钟后,TCP 连接的远程端已经减慢到这样的程度,即使 Android 设备被唤醒,TCP 连接也可能太慢而无法使用——此时您的无论如何,程序都需要关闭陷入困境的 TCP 连接并启动一个新的连接,那么为什么还要费心让它保持打开状态呢?
解决方案
Acquire a PARTIAL_WAKE_LOCK, and trap when the screen goes off. Then disable and reenable the wifi. This works because the filter only turns on when the screen goes off, so starting wifi with the screen off will keep it working until the screen goes off again.
关于java.net.SocketException : sendto failed: EPIPE (Broken pipe) When sending character to check socket connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33361031/
int i; System.out.print("Please enter a string: "); String string_1 = input.nextLine(); System.out
我想要一个正则表达式来检查 a password must be eight characters including one uppercase letter, one special charac
在此先感谢您的帮助。 在命令行输入“example”时,Python 返回“example”。我在网上找不到任何东西来解释这一点。所有引用资料都在 print 命令的上下文中谈到字符串,我得到了所有关
我有 CSV 格式的数据,这些数据在字符编码方面被严重打乱,可能在不同的软件应用程序(LibreOffice Calc、Microsoft、Excel、Google Refine、自定义 PHP/My
我正在为 Latex 使用 Sublime Text,所以我需要使用特定的编码。但是,在某些情况下,当我粘贴从不同程序(大多数情况下为单词/浏览器)复制的文本时,我收到以下消息: "Not all c
在 flutter 中,我使用了一个php文件,该文件从数据库查询返回json响应,但是当我尝试解码json时,出现此错误: E/flutter ( 8294): [ERROR:flutter/lib
我在 Flutter 项目中遇到异常。错误如下所示: Exception has occurred. FormatException (FormatException: Unexpected char
这个问题已经有答案了: Why doesn't my compare work between char and int in Java? (4 个回答) 已关闭 3 年前。 我试图在我的代码中找出
我在 Flutter 项目中遇到异常。错误如下所示: Exception has occurred. FormatException (FormatException: Unexpected char
我是 python 新手,需要一些帮助。我应该编写一个脚本,从键盘读取单词,直到输入单词 999。对于除 999 之外的每个单词,报告该单词是否有效。如果单词的第一个字符等于最后一个字符,则该单词有效
我正在实现自己的词法分析器,并且刚刚了解了 C# 如何处理字 rune 字:https://msdn.microsoft.com/en-us/library/aa691087(v=vs.71).asp
我有这个字符串: var test = "toto@test.com"; 我想用空值替换“@”字符后的所有字符。我想得到这个字符串: var test = "toto" 最佳答案 试试这个: test
我将数据库从 sqlite 更改为 postgresql 以用于我网站的生产,但出现此错误。当我在本地使用 sqlite 时,它没有出现这个错误。使用 Django。 ProgrammingErr
我正在为我的实验表制作凯撒密码,并使其能够加密 3 代入(凯撒密码),这是练习的重点。但是有一件事困扰着我。首先,如果我输入 3 以外的字符,则有一个尾随字符。例如,输入“恶意软件”,然后输入 2 作
遵循 this question 中的逻辑,以下代码应该有效: #include int main(){ printf("%c", '\0101'); return 0; } 然而,
我在处理一段代码时遇到错误: Too many characters in character literal error 使用 C# 和 switch 语句遍历字符串缓冲区并读取标记,但在这一行中出
给定一个元素,其值为: Distrib = SU & Prem <> 0 我要转<或 >进入 <或 >因为下游应用程序需要
从表面上看,他们似乎都在做同样的事情。但似乎是后者as(,"character")更强大。 作为示例,请考虑以下内容: library(rvest) temp % html_node("div p")
我刚开始使用python,所以很可能只是在做一些愚蠢的事情。我正在从表中读取数据,需要将它们放入txt文件的列中。我无法说服我的代码创建新行。 这是我的代码- file = open("test_m.
在尝试刷新我的项目的 Fortran 90 知识时,我在使用内部文件时遇到了一些奇怪的情况。考虑示例代码: ! ---- internal_file_confusion.f90 ---- progra
我是一名优秀的程序员,十分优秀!