powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO.2, асинхронные каналы, серверное приложение.
4 сообщений из 4, страница 1 из 1
NIO.2, асинхронные каналы, серверное приложение.
    #38157631
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется серверное приложение:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
package com.gmail.dosofredriver.ajax.serviceserver.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * Date: 19.02.13
 * Time: 18:47
 *
 */
public class Server3 {
    private AsynchronousServerSocketChannel assc;
    private AsynchronousChannelGroup group;
    AsynchronousSocketChannel asc;
    private ByteBuffer bb;

    int port = 777;

    public Server3() {
        bb = ByteBuffer.allocate(16384);
        try {
            startServer();
        } catch (IOException | InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    public void startServer() throws IOException, InterruptedException, ExecutionException {
        group = AsynchronousChannelGroup.withFixedThreadPool(8, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread() {

                    @Override
                    public void run() {
                        System.out.println("run()");
                    }
                };
            }
        });

        assc = AsynchronousServerSocketChannel.open(group).bind(new InetSocketAddress(port));

        System.out.println(assc.getLocalAddress());

        assc.accept("Attachment", new CompletionHandler<AsynchronousSocketChannel, String>() {
            @Override
            public void completed(AsynchronousSocketChannel result, String attachment) {
                System.out.println("Completed");
                try {
                    System.out.println("Accepted: " + asc.getRemoteAddress());
                    asc = assc.accept().get();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void failed(Throwable exc, String attachment) {
                System.out.println("Failed");
            }
        });

        group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
    }
}



Так же есть простой клиент:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
package com.gmail.dosofredriver.ajax.serviceserver.util.parser;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;

/**
 * Date: 19.02.13
 * Time: 20:45
 *
 */
public class Client {
    AsynchronousSocketChannel asc;

    public Client() throws IOException {
        asc = AsynchronousSocketChannel.open();
        asc.connect(new InetSocketAddress("127.0.0.1", 777));
        System.out.println("Connection set");
        asc.write(ByteBuffer.wrap((new String("Hello world!").getBytes())));
        System.out.println("Send");
    }

    public static void main(String ... args) {
        try {
            new Client();
        } catch (IOException e) {
            e.printStackTrace();  
        }
    }

}





На стандартном выводе сервера:
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
startServer().new ThreadFactory().new Thread().run()
/0:0:0:0:0:0:0:0:777


На стандартном выводе клиента:
Connection set
Send

Process finished with exit code 0


Вопрос: Как его обрабатывать соединение на сервере, если ни один из представленных евентов не срабатывает?
...
Рейтинг: 0 / 0
NIO.2, асинхронные каналы, серверное приложение.
    #38159902
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiver,

навскидку:

- ваше расширение Thread не должно переопределять run(), а если переопределяет, то должно вызывать super.run()
- в complete надо использовать result, а вызывать assc.accept не нужно
- чем изобретать колесо, воспользуйтесь готовой библиотекой, приводящей асинхронный обмен к божескому виду, например https://github.com/rfqu/df4j] https://github.com/rfqu/df4j
...
Рейтинг: 0 / 0
NIO.2, асинхронные каналы, серверное приложение.
    #38159934
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiver,

еще ошибки:
- public Thread newThread(Runnable r) теряет параметр r и соответственно его не исполняет. Потому у вас не вызывается Completion handler и не печатается "Completed" и "Accepted: "
- чтение не запускается, буфер bb не используется
...
Рейтинг: 0 / 0
NIO.2, асинхронные каналы, серверное приложение.
    #38160574
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfq,

Да, действительно, проблема заключалась в методе newThread(), в частности аргумент Runnable r использовался для построения нового треда.

javadoc: "param r a runnable to be executed by new thread instance".

rfq- ваше расширение Thread не должно переопределять run(), а если переопределяет, то должно вызывать super.run()

Не понял вас. Вот цитата из javadoc: "There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and started. ".

Я собственно так и сделал.

rfq- в complete надо использовать result, а вызывать assc.accept не нужно

result я не использовал лишь потому, что это тестовый код. А раз не работает println(), то и весь нижележащий код так же не работает.

По поводу accept(). Вот пример из javadoc:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  final AsynchronousServerSocketChannel listener =
    AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(5000));
 
    listener.accept(null, new CompletionHandler&lt;AsynchronousSocketChannel,Void&gt;() {
       public void completed(AsynchronousSocketChannel ch, Void att) {
           // accept the next connection
           listener.accept(null, this);
 
           // handle this connection
           handle(ch);
       }
       public void failed(Throwable exc, Void att) {
           ...
       }
   });



Опять же, если не вызывать этот самый listener.accept(null, this) внутри complete, хендлер работать не будет . Так было с моим кодом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Override
            public void completed(AsynchronousSocketChannel result, String attachment) {
                System.out.println("Completed");
                assc.accept(null, this);
                handle(result);
                try {
                    System.out.println("Accepted: " + result.getRemoteAddress());

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }



rfq- чем изобретать колесо, воспользуйтесь готовой библиотекой, приводящей асинхронный обмен к божескому виду, например https://github.com/rfqu/df4j

Код был написан в учёбных целях, для проекта планировал взять что-нибудь вроде Netty. А за ссылку спасибо.

Рабочий код, на всякий случай:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
package com.gmail.dosofredriver.ajax.serviceserver.server;

import java.awt.*;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * Date: 19.02.13
 * Time: 18:47
 *
 */
public class Server3 {
    private AsynchronousServerSocketChannel assc;
    private AsynchronousChannelGroup group;
    AsynchronousSocketChannel asc;
    private ByteBuffer bb;

    int port = 777;

    public Server3() {
        bb = ByteBuffer.allocate(16384);
        try {
            startServer();
        } catch (IOException | InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    public void startServer() throws IOException, InterruptedException, ExecutionException {
        group = AsynchronousChannelGroup.withFixedThreadPool(8, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r);
            }
        });

        assc = AsynchronousServerSocketChannel.open(group).bind(new InetSocketAddress(port));
        System.out.println(assc.getLocalAddress());

        assc.accept("Attachment", new CompletionHandler<AsynchronousSocketChannel, String>() {
            @Override
            public void completed(AsynchronousSocketChannel result, String attachment) {
                System.out.println("Completed");
                assc.accept(null, this);
                handle(result);
                try {
                    System.out.println("Accepted: " + result.getRemoteAddress());

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void failed(Throwable exc, String attachment) {
                System.out.println("Failed");
            }
        });

        group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
    }

    private void handle(AsynchronousSocketChannel result) {
        ByteBuffer bb = ByteBuffer.allocate(16364);
        result.read(bb);
        System.out.println(new String(bb.array()));
    }
}

...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / NIO.2, асинхронные каналы, серверное приложение.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]