Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Однопоточный многосокетный клиент / 13 сообщений из 13, страница 1 из 1
09.02.2013, 20:48:29
    #38144632
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Приветствую.

Не могу найти пример реализации однопоточного неблокирующиего клиента со множеством соединений. Возможно ли реализация онного? Везде приводятся примеры только однопоточных серверов. Не могли кто нибудь привесит принципиальный пример?
...
Рейтинг: 0 / 0
09.02.2013, 21:13:47
    #38144643
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Типа такого?
http://www.devx.com/tips/Tip/40931
...
Рейтинг: 0 / 0
09.02.2013, 21:31:49
    #38144658
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Blazkowicz,
по ссылке односокетный...
...
Рейтинг: 0 / 0
09.02.2013, 21:47:13
    #38144662
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
что значит многосокетный и зачем он нужен?
...
Рейтинг: 0 / 0
09.02.2013, 21:48:19
    #38144664
Умаксуман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
забыл никчто значит многосокетный и зачем он нужен?

наверно тс хочет коннектиться сразу к нескольким серверам для реализации фейловера
...
Рейтинг: 0 / 0
09.02.2013, 22:53:44
    #38144702
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
подозреваю это значит что он хочет в одном потоке делать несколько accept
...
Рейтинг: 0 / 0
10.02.2013, 01:01:21
    #38144818
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
dalyBlazkowicz,
по ссылке односокетный...
Ну, и какая принципиальная разница для однопоточного клиента?
...
Рейтинг: 0 / 0
10.02.2013, 10:13:28
    #38144938
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
забыл никчто значит многосокетный и зачем он нужен?Нужно несколько соединений к разным серверам в одном потоке. Для этого мне и нужен неблокирующий сокет.

Умаксуманнаверно тс хочет коннектиться сразу к нескольким серверам для реализации фейловераВообще, для задачи реализации сборщика логов с корпоративных мини АТС, которые льют статистику по 23 порту.

Blazkowicz, благодарю за пример.

Вроде бы получилось организовать прием данных с разных серверов в одном потоке вот так
example
Код: 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.
import java.net.*;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class Client {
	public static void main(String[] ar) throws IOException {

		SocketChannel client = SocketChannel.open();
		SocketChannel client2 = SocketChannel.open();

		client.configureBlocking(false);
		client2.configureBlocking(false);

		client.connect(new InetSocketAddress("127.0.0.1", 25));
		client2.connect(new InetSocketAddress("127.0.0.1", 26));

		Selector selector = Selector.open();

		client.register(selector, SelectionKey.OP_CONNECT
				| SelectionKey.OP_READ | SelectionKey.OP_WRITE);
		client2.register(selector, SelectionKey.OP_CONNECT
				| SelectionKey.OP_READ | SelectionKey.OP_WRITE);

		while (selector.select() > 0) {

			Set<SelectionKey> keys = selector.selectedKeys();
			Iterator<SelectionKey> i = keys.iterator();

			while (i.hasNext()) {

				SelectionKey key = (SelectionKey) i.next();

				i.remove();

				SocketChannel channel = (SocketChannel) key.channel();

				if (key.isConnectable()) {

					System.out.println("Connect " + channel.socket().getPort());

					if (channel.isConnectionPending())
						channel.finishConnect();
				}

				if (key.isReadable()) {
					System.out.println("Read" + channel.socket().getPort());

					ByteBuffer buffer = ByteBuffer.allocate(1000);

					channel.read(buffer);

					buffer.clear();
				}

			}
		}

	}
}

но есть проблема - код грузить процессор на 100%. Хотя согласно документации java docThis method performs a blocking selection operation. It returns only after at least one channel is selected метод Selector.select() должен останавливать поток пока не придут данные по какому либо каналу. Или я не понимаю чего то?
...
Рейтинг: 0 / 0
10.02.2013, 11:20:51
    #38144968
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Всем спасибо, вроде получилось...
Код: 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.
import java.net.*;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class Client {
	public static void main(String[] ar) throws IOException {

		SocketChannel client = SocketChannel.open();
		SocketChannel client2 = SocketChannel.open();

		client.configureBlocking(false);
		client2.configureBlocking(false);

		client.connect(new InetSocketAddress("127.0.0.1", 25));
		client2.connect(new InetSocketAddress("127.0.0.1", 26));

		Selector selector = Selector.open();

		client.register(selector, 
				 SelectionKey.OP_READ);
		client2.register(selector, 
				 SelectionKey.OP_READ );

		
		if (client.isConnectionPending())
			client.finishConnect();
		
		if (client2.isConnectionPending())
			client2.finishConnect();
		
		while (selector.select() > 0) {

			Set<SelectionKey> keys = selector.selectedKeys();
			Iterator<SelectionKey> i = keys.iterator();

			while (i.hasNext()) {

				SelectionKey key = (SelectionKey) i.next();

				i.remove();

				SocketChannel channel = (SocketChannel) key.channel();

				if (key.isReadable()) {
					System.out.println("Read" + channel.socket().getPort());

					ByteBuffer buffer = ByteBuffer.allocate(1000);
					
					channel.read(buffer);
					
					buffer.clear();
					
					byte[] bytearr = new byte[buffer.remaining()];
					buffer.get(bytearr);
					
					System.out.println(new String(bytearr));
				}

			}
		}

	}
}

...
Рейтинг: 0 / 0
10.02.2013, 21:05:37
    #38145306
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Google for c10k, netty, vert.x
...
Рейтинг: 0 / 0
11.02.2013, 20:12:12
    #38146791
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
dalyВообще, для задачи реализации сборщика логов с корпоративных мини АТС, которые льют статистику по 23 порту.И зачем для нескольких АТС "многосокетный" клиент???
...
Рейтинг: 0 / 0
12.02.2013, 07:30:16
    #38147118
daly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
Basil A. SidorovdalyВообще, для задачи реализации сборщика логов с корпоративных мини АТС, которые льют статистику по 23 порту.И зачем для нескольких АТС "многосокетный" клиент???Уже отказался от этой идеи по нескольким причинам.

Было бы интересно узнать ваши доводы против такого подхода,
ведь в теории такая программа будет сжирать меньше ресурсов ОС и
работать быстрее (не принимаем во внимание многоядерные системы).
Только ко лишь простота реализации?
...
Рейтинг: 0 / 0
12.02.2013, 11:01:24
    #38147333
Умаксуман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Однопоточный многосокетный клиент
неужели поток требует столько ресурсов?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Однопоточный многосокетный клиент / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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