当有数据可用于在socket中读取时,android中是否有任何回调机制

Kri*_*dra 14 sockets android asynchronous callback listener

好吧,我熟悉c,iOS环境下的套接字编程.但现在尝试通过套接字连接我的android和我的远程服务器......作为一个启动,我在C中编写了一个简单的服务器程序并在我的桌面上运行它耐心地等待连接请求,接受连接,然后等待一些请求字符串,并在获取请求字符串时返回一些响应字符串,然后再次等待下一个请求并继续...好了,你明白了...

至今

  1. 我已经与我的android和服务器建立了连接
  2. 发送和接收数据

这是我的客户端代码..

public class SocketMaster {
    private Socket clientSocket     =   null;
        BufferedReader socketReadStream =   null;
    public boolean connectToHost(String ip, int port){
        try {
            InetAddress serverAddr  =   InetAddress.getByName(ip);
            try {
                clientSocket        =   new Socket(serverAddr, port);
                socketReadStream    =   new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String line     =   null;
                String stringToSend =   "This is from client ...Are you there???";

                //Write to server..stringToSend is the request string..
                this.writeToServer(stringToSend);

                //Now read the response..
                while((line = socketReadStream.readLine()) != null){
                    Log.d("Message", line);
                }
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public boolean writeToServer(String stringToSend){
        DataOutputStream dos        =   null;
        try {
            dos                         =   new DataOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        try {
            dos.write(stringToSend.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我从另一个活动创建一个SocketMaster对象,并调用connectToHost传递ip和服务器端口..一切正常,我能够连接,发送和接收数据..

现在我的问题是这些问题

//Now read the response..
while((line = socketReadStream.readLine()) != null){
     Log.d("Message", line);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,执行此代码的线程

  • 阻止直到有数据要读取
  • 如果数据可用,则读取它,然后因为循环再次阻塞,直到下一个数据块到达

我只能在主线程上运行此代码,因为它会阻止我的UI活动.我可以想到在后台线程中运行它,这是一个选项...

但理想情况下我想要的是......

一个回调(我认为,听说者用android术语,任何熟悉iOS CFSocket回调的人),方法,当有数据可供读取时调用,这样我就可以只读取数据然后返回..

在android/java中是否有这样的机制...如果不是(:-(),任何人都可以将我链接到一些示例,其中套接字处理在后台完成...

编辑: 我自己并没有要求创建一个回调机制.我只是问是否有任何监听器存在,当有数据要读取时,连接断开时通知你.因此我可以消除上面给出的while循环. ..如果没有任何回调,我准备将此套接字移动到另一个线程,该线程循环并读取数据(事实上我已经完成了)...

**

再次编辑赏金时间..

**

好吧,我是2弱的老android/java开发人员,具有良好的3.5年的c/c ++/objective c开发经验...所以我看到了低级c本机套接字(当使用read()时阻塞(可配置) recv())和apple的CFSocket(它是C socket本身,但是提供了一个提供回调机制的包装器).. 我不是在问自己编写一个回调机制(如果没有现成的替代方案,我会全心全意地做现在,但为什么要重新发明轮子?)...我开始理解java作为非常先进和高水平的平台..我认为应该有一些更高级别的包装库潜伏着......所以我想增加观众通过开始赏金到这个线程..

Nik*_*kov 8

在Java中没有现成的回调函数.您可以使用NIO包中的类轻松实现一个.你最需要Selector和SocketChannel.如果您熟悉select(2),应该很容易理解.如果没有,请尝试NIO教程.

http://download.oracle.com/javase/1.5.0/docs/api/java/nio/channels/SocketChannel.html http://download.oracle.com/javase/1.5.0/docs/api/java /nio/channels/Selector.html

在任何情况下,您都必须轮询套接字以检查是否有数据,并且您不能在主线程上执行此操作.除非您的Android应用程序应该在同一个线程上管理多个连接,否则使用阻塞IO可能要容易得多.另一件需要考虑的事情是:如果必须连续运行/很长一段时间,您需要将其移至服务中.即便如此,如果资源耗尽,操作系统也可以杀死它,因此请准备好处理重新连接.

HTH