【问题标题】:How to handle tcp inputstream correctly - Java/Android如何正确处理 tcp 输入流 - Java/Android
【发布时间】: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],它不会影响变量bufferin handleTCPInput 的内容
  • 剧透:如果连接已成功建立,isConnected 将变为真并保持真。当它丢失时,唯一的判断方法是 I/O 操作何时失败。即使这样,您的服务器速度也可能会导致超时。

标签: java android tcp inputstream


【解决方案1】:

为了实现这一点,我建议您启动一个处理程序线程,该线程将不断地从输入流中读取。

一旦它读取了传入的消息,它就会使用处理程序将其传递给主线程。

例如。 handler.sendMessage()

现在,由于此处理不是繁重的操作,您可以决定主/UI 线程来处理此信息,或者您可以启动异步任务来执行此操作。

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 2022-07-25
    • 2021-04-24
    • 2011-04-20
    • 2015-02-26
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多