android - TCP 客户端套接字未监听接收器线程
问题描述
以下代码无法从 TCP 服务器读取数据。我无法找到问题。任何帮助将不胜感激。
class Receive extends Thread {
public void run() {
while (true){
StringBuilder log = new StringBuilder();
String line = null;
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
if(bufferedReader!=null){
while (true) {
try {
if (!((line = bufferedReader.readLine()) != null)) break;
} catch (IOException e) {
e.printStackTrace();
}
log.append(line);
}
Log.d("==> ", "data is " + line);
}
}
}
}
解决方案
外循环是不必要的,应该删除。readLine()
但更重要的是,只有在返回一个字符串时才打破内部循环null
,然后再尝试记录它null
。
试试这个:
class Receive extends Thread {
public void run() {
try {
StringBuilder log = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
Log.d("==> ", "data is " + log.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
话虽如此,请注意这种代码会从服务器读取整行,直到它断开您的客户端。并非所有协议都是基于线路的,或者服务器发送数据后断开连接。如果这就是您的服务器的行为方式,那就这样吧。但这对于服务器来说是不寻常的。在不知道您实际连接到哪种服务器的情况下,很难说是否应该首先使用这种代码。
推荐阅读
- hp-uft - 单击 UFT 中的“运行”按钮 - 没有任何反应
- sybase - sybase 交互式sql初始化错误(java路径)
- laravel - Laravel AppServiceProvider 和自定义服务提供者的区别
- react-native - 从数组中的最后一个对象反应原生模态打开
- python - 会话在其他请求中为无
- python - tf.config.experimental.list_logical_devices('GPU') 使内核和 jupyter notebook 服务器崩溃
- php - 上传没有编码的xml文件
- sql - 在 SQL Oracle 中通过仅匹配前两个十进制值来舍入一个数字
- recursion - 如何将此序列转换为 MIPS 汇编代码?
- python - 如果 groupby 对象中的列值为最小值,则返回 pandas 系列的更快方法,否则返回 False