Java эквивалент C # Stream.BeginRead () и AsyncResult? - PullRequest
1 голос
/ 22 августа 2010

У меня есть такой код для переноса на 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 ]

1 голос
/ 23 августа 2010

В Java есть NIO, который поддерживает неблокирующий, но не асинхронный / управляемый событиями ввод-вывод. Однако на базе NIO были созданы различные библиотеки, предлагающие такого рода API / поведение.

Один из лучших - netty , который я могу порекомендовать из личного пользования.

РЕДАКТИРОВАТЬ: Я считаю, что истинный асинхронный ввод-вывод в Java 7.

0 голосов
/ 23 августа 2010

AFAIK Ядро Java не имеет асинхронного ввода-вывода, который вы ищете, но не кажется большой проблемой создать его самостоятельно - создайте пару классов, реализующих поток (один для чтения один для записи), заставить конструкторы этих классов принимать те же параметры, что и BeginRead / BeginWrite, добавить делегаты и все. Статью о делегатах можно найти в ответе выше.

0 голосов
/ 22 августа 2010

Я не думаю, что в JDK встроен прямой языковой эквивалент, но возможно собрать вместе один из ваших:

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

Если нет, то, возможно, Java NIO - неблокирующий ввод / вывод - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...