Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен файлами, два сокета / 15 сообщений из 15, страница 1 из 1
20.04.2011, 17:15:09
    #37225021
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Здравствуйте.
В общем, задача такая. Есть сервер. Я планирую сделать два сокета на разных портах - один для "диалога" между сервером и клиентом, второй для обмена файлами. Например клиент посылает по первому сокету команду на скачивание файла, тут же создается второй сокет и по нему происходит передача, а первый опять слушает клиента и принимает от него команды.
Проблема в том, что я не знаю как это правильно сделать. Сразу, при подключении клиента создавать два сокета не красиво и не экономно - второй может вообще не понадобиться. Тогда второй сокет нужно создавать в момент получения сервером запроса на скачивание файла. Вот тут и начинаются непонятки. Когда создается ServerSocket, он делает accept() всех клиентов, точнее первым будет тот, кто успеет первым. Соответственно, серверу нужно знать, какому клиенту сделать accept(). А если таких сокетов будет много, то серверу надо как-то связывать их с клиентами... Вот как это сделать?
...
Рейтинг: 0 / 0
20.04.2011, 17:31:32
    #37225067
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
А зачем всё это в то время как уже давно разработаны такие протоколы как FTP и HTTP?
...
Рейтинг: 0 / 0
20.04.2011, 17:36:01
    #37225084
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Да это что-то вроде учебного проекта. А что есть в HTTP, что можно использовать тут?
...
Рейтинг: 0 / 0
20.04.2011, 17:37:08
    #37225091
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Не, не надо так котегорично ... :) Человек, в принципе, делает не так уж неправильно.
Просто сокет можно вешать и на другой порт, а вот обмен файлами оставить и на стандартном 80-ом. И делать получение/отдачу файлов стандартными средствами.
...
Рейтинг: 0 / 0
20.04.2011, 17:41:56
    #37225100
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
IDVsbruckНе, не надо так котегорично ... :) Человек, в принципе, делает не так уж неправильно.
Просто сокет можно вешать и на другой порт, а вот обмен файлами оставить и на стандартном 80-ом. И делать получение/отдачу файлов стандартными средствами.
Какие средства Вы имеете ввиду?
У меня проблема в том, что я пока не понимаю как за этим всем должен следить и управлять сервер. Ему нужно ведь иметь четкую связь между клиентом и двумя сокетами. Но с диалоговым сокетом связь в данном случае очевидна, а вот со вторым - с передающим/принимающим совсем не очевидна и потеряется.
...
Рейтинг: 0 / 0
20.04.2011, 17:43:02
    #37225106
bezb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
ну смотри
если решать твою задачу - прослушивать на сокете и передавать файлы - второй сокет не нужен, для передачи данных используешь channel

если упрощённо -
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
ServerSocket serverSocket = serverSocketChannel.socket();
serverSocket.bind( new  InetSocketAddress("adres",  10000 ));
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
			
selector.select( 1000 );

Set<?> keySet = selector.selectedKeys();
Iterator<?> it = keySet.iterator();
			
 while  (it.hasNext()) {
	//	для проверок будет нужен
	SelectionKey selectionKey = (SelectionKey) it.next();
	it.remove();
				
	Socket socket = serverSocket.accept();
	SocketChannel channel = socket.getChannel();
	//	или же, по своему коду посмотришь		
	//	channel = (SocketChannel) selectionKey.channel();
				
	// 	передаёшь файл так, вынеси в отдельный тред
	ByteBuffer[] data =  new  ByteBuffer[ 1024 ];
	channel.write(data);
}

по коду не забудь разные
Код: plaintext
1.
2.
3.
selectionKey.isValid() 
selectionKey.isAcceptable())
selectionKey.isReadable()
selectionKey.isWritable()
...
Рейтинг: 0 / 0
20.04.2011, 17:52:33
    #37225146
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
bezb, в твоем коде передача идет сразу после получения запроса, и рассчитывается, что файл имеет небольшие размеры. Мои файлы будут иметь размеры до гигабайта, соответственно нужна возможностью прерывания передачи. А для этого серверу надо знать, какой сокет отключить. (Или, вообще сделать закрытие сокета на стороне клиента, и тогда тред на сервере тоже прекратит работу(?))... хм.
А почему ты советуешь использовать именно channel? Не проще ли использовать просто Socket s = ServerSocket.accept() и далее работать с DataInput/OutputStream?
Да, у меня все это дело по SSL работает
...
Рейтинг: 0 / 0
20.04.2011, 17:55:33
    #37225153
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
DataInput/OutputStream здесь вообще к чему?
...
Рейтинг: 0 / 0
20.04.2011, 17:59:38
    #37225163
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
BlazkowiczDataInput/OutputStream здесь вообще к чему?
Я их планировал использовать для приема передачи файла, типа такого:
SSLSocket sDialogue;
...
DataInputStream socketInputStream = (DataInputStream) sDialogue.getInputStream();
...
Рейтинг: 0 / 0
20.04.2011, 18:01:10
    #37225166
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Точнее не только файлов, а еще команды через них отпралять
...
Рейтинг: 0 / 0
21.04.2011, 09:43:34
    #37225960
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Diego ViajeroТочнее не только файлов, а еще команды через них отпралять Образец .
Есть TFTP - он попроще. Правда, для TCP его адаптировать придётся.
...
Рейтинг: 0 / 0
21.04.2011, 10:29:18
    #37226039
bezb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Diego Viajero
хоть большие, хоть маленькие
в том месте создаёшь отдельный thread и в нём "в цикле" передаёшь файл.. я тестировал на >2Gb.. естественно, в коде что я привёл - всё упрощено.
А со вторым сокетом - будет то же самое, я не понимаю, зачем он.. Да и, ты сам этого не представляешь, насколько я понял..
...
Рейтинг: 0 / 0
22.04.2011, 13:33:37
    #37228594
Diego Viajero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
bezb, а что посоветуете почитать по java.nio? Вот нашел http://habrahabr.ru/blogs/java/70690/ на русском, но, там как-то сумбурно все. Наверное твой код то, что мне и надо, но, мне нужно в этом лучше разобраться
...
Рейтинг: 0 / 0
22.04.2011, 14:45:43
    #37228810
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен файлами, два сокета
Diego Viajeroчто посоветуете почитать по java.nio?Возьмите HttpCore и углубитесь в реализацию собственных хотелок, но без (излишнего) погружения в сокеты и прочий транспорт.
...
Рейтинг: 0 / 0
31.03.2012, 11:05:46
    #37732646
Обмен файлами, два сокета
bezbDiego Viajero
хоть большие, хоть маленькие
в том месте создаёшь отдельный thread и в нём "в цикле" передаёшь файл.. я тестировал на >2Gb.. естественно, в коде что я привёл - всё упрощено.
А со вторым сокетом - будет то же самое, я не понимаю, зачем он.. Да и, ты сам этого не представляешь, насколько я понял..
"bezb" с того места где вы говорите о передачи файла, можно о нём по подробней пожалуйста.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Обмен файлами, два сокета / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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