Java相当于C#Stream.BeginRead()和AsyncResult?

时间:2010-08-22 19:25:56

标签: c# java sockets

我有这种代码移植到Java:

public class MyClass
{
    Stream _stream;
    AsyncCallback callback;
    IAsyncResult readOperation;

    public MyClass(string host, string port)
    {
        TcpClient tcpClient = new TcpClient();
        tcpClient.Connect(host, port);
        _stream = tcpClient.GetStream();
        callback = new AsyncCallback(Read);
        readOp = _stream.BeginRead(headerBuffer, 0, 1, callback, null);
    }

    private void listen(IAsyncResult asyncResult)
    {
        _stream.EndRead(asyncResult);
        //Do some work
        readOperation = _stream.BeginRead(headerBuffer, 0, 1, callback, null);
    }
}

我尝试过这个并没有取得真正的成功

es = Executors.newFixedThreadPool(2);
es.execute(new ListenTask());

public class ListenTask implements Runnable {

    public void run() {
        //Stream is a SocketChannel
    _stream.socket().getInputStream().read(headerBuffer, 0, 1);
    }
}

我应该使用SocketChannel.read()吗?

奖金问题:java的等价物是什么     readOperation.AsyncWaitHandle.WaitOne();

非常感谢

3 个答案:

答案 0 :(得分:1)

Java有NIO支持非阻塞但不支持异步/事件驱动的IO。然而,各种库已经构建在NIO之上,提供了这种API /行为。

最好的一个是netty我可以从个人用途推荐。

编辑:我相信真正的异步IO将在Java 7中出现。

答案 1 :(得分:0)

我认为JDK中没有内置的直接语言,但是可以拼凑一个你自己的语言:

http://onjava.com/pub/a/onjava/2003/05/21/delegates.html

如果没有,那么也许Java NIO - 非阻塞I / O - 正是您正在寻找的。

答案 2 :(得分:0)

AFAIK Java核心没有您正在寻找的异步i / o,但是自己创建一个似乎不是一个大问题 - 创建一些实现线程的类(一个用于读取,一个用于编写),使这些类的contstructors接受与BeginRead / BeginWrite相同的参数,添加委托,这就是全部。关于代表的文章可以在上面的答案中找到。