【发布时间】:2016-10-13 19:50:21
【问题描述】:
我正在创建一个需要永久 TCP 连接到服务器的 android 应用程序。
我创建了一个服务,它建立连接并侦听 Inputstream 上的传入字节(该服务在后台运行)。
public class TCPServiceConnection extends Service{
//variables......
//...............
public void onCreate() {
establishTCPConnection():
}
前 4 个传入字节表示完整消息的消息长度。
从 Inputstream 中将完整的 Message 读入单独的缓冲区后,我想在单独的 Thread 中调用另一个 Service/Asynctask 来分析 Message。 (服务应继续侦听更多传入消息)。
public handleTCPInput() {
while(tcp_socket.isConnected()) {
byte[] buffer = readCompletemessagefromTCPInputstream;
calltoAnotherThreadToanalyzeReceivedMessage(buffer);
}
//handle exceptions.......
}
Android/Java 中是否有一个现有的 Messagequeue 系统已经处理了对我分离的 byte[] 缓冲区的多路访问?
【问题讨论】:
-
“多访问我的分离字节[] 缓冲区”是什么意思?
-
我的“handleTCPInput”方法中的byte[]缓冲区不是通过引用传递给另一个线程吗?
-
我不得不承认我在 Java 编程世界中确实是新手,直到现在我还认为方法总是在 java 中通过引用来调用?
-
旁注:
tcp_socket.isConnected()很可能并不完全符合您的预期。但是对于你的问题。在 Java 中,所有 Method 参数都是按值传递的。在您的情况下,传递了缓冲区“地址”的副本。因此,如果您更改数组内部的某些内容,它将在调用者处看到,但您不能将另一个数组实例分配给被调用方法中的参数,并且也不能在调用者处更改它。因此,如果您在calltoAnother...中执行buffer = new byte[128],它不会影响变量bufferinhandleTCPInput的内容 -
剧透:如果连接已成功建立,
isConnected将变为真并保持真。当它丢失时,唯一的判断方法是 I/O 操作何时失败。即使这样,您的服务器速度也可能会导致超时。
标签: java android tcp inputstream