Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двоекратная посылка данных через сокет, Сервер принимает 2 раза, хотя шлю 1 раз 
V
    Опции темы
HugeX
Дата 28.6.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 19.9.2009

Репутация: нет
Всего: нет



Здравствуйте, дорогие друзья! smile
Я обмениваюсь данными с сервером через SSLSocket. Хотя с клиентом все нормально, как по мне, но посланные мною один раз данные сервер принимает дважды. Никак не пойму, в чем проблема :(
Вот код метода клиента:
Код

    public String sendRequest(String request, boolean waitAnswer) {
        try {
            SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket ssls = (SSLSocket) sslsf.createSocket();
            ssls.connect(new InetSocketAddress("111.111.111.111", 9090), connectTimeOut * 1000);
            ssls.setSoTimeout(readTimeOut * 1000);

            if (waitAnswer) {
                OutputStream os = ssls.getOutputStream();
                InputStream is = ssls.getInputStream();
                os.write(request.getBytes());
                byte[] data = new byte[1024];
                is.read(data);
                is.close();
                os.close();
                ssls.close();
                return new String(data);
            } else {
                OutputStream os = ssls.getOutputStream();
                os.write(request.getBytes());
                os.flush();
                os.close();
                ssls.close();
                return new String("OK");
            }
        } catch(SocketTimeoutException ioe) {
            ioe.printStackTrace();
            return "ERROR";
        } catch(IOException ioe) {
            ioe.printStackTrace();
            return "ERROR";
        }
    }

Кстати, сервер работает на базе NIO Framework. Если кто знает более удачный способ, напишите, пожалуйста. Всем заранее благодарен.
PM MAIL   Вверх
Skipy
Дата 28.6.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



А код сервера можно? Тот, который принимает данные и работает на базе NIO.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
HugeX
Дата 28.6.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 19.9.2009

Репутация: нет
Всего: нет



Вот код сервера:
Код

package ua.simpletouch.server;

/**
 *
 * @author Alexander Matis
 */
import ch.unifr.nio.framework.AbstractAcceptor;
import ch.unifr.nio.framework.ChannelHandler;
import ch.unifr.nio.framework.Dispatcher;
import ch.unifr.nio.framework.ssl.AbstractSSLChannelHandler;
import ch.unifr.nio.framework.ssl.SSLTools;
import ch.unifr.nio.framework.transform.AbstractForwarder;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.security.GeneralSecurityException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.net.ssl.SSLContext;

public class SSLNIOServer extends AbstractAcceptor {
    private static ExecutorService executor = Executors.newCachedThreadPool();
    private final SSLContext sslContext;

    public SSLNIOServer(Dispatcher dispatcher, SocketAddress socketAddress)
            throws IOException, GeneralSecurityException {
        super(dispatcher, socketAddress);

        URL trustStoreURL = new URL("file:" + Server.getServer().getProperty("storesFolder") + Server.getServer().getProperty("trustStoreServer"));
        URL keyStoreURL = new URL("file:" + Server.getServer().getProperty("storesFolder") + Server.getServer().getProperty("keyStoreServer"));
        sslContext = SSLTools.getServerSSLContext(trustStoreURL, Server.getServer().getProperty("trustStoreServerPass"), keyStoreURL, Server.getServer().getProperty("keyStoreServerPass"), Server.getServer().getProperty("alias"));
    }

    public static void maiN() {
        try {
            Dispatcher dispatcher = new Dispatcher();
            dispatcher.start();

            int port = Integer.parseInt(Server.getServer().getProperty("portToListen"));
            SocketAddress socketAddress = new InetSocketAddress(port);
            SSLNIOServer sSLNIOServer = new SSLNIOServer(dispatcher, socketAddress);
            sSLNIOServer.start();
            
        } catch (GeneralSecurityException gse) {
            gse.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    @Override
    protected ChannelHandler getHandler(SocketChannel socketChannel) {
        return new SSLEchoServerChannelHandler(sslContext, socketChannel);
    }

    private static class SSLEchoServerChannelHandler extends AbstractSSLChannelHandler {
        public SSLEchoServerChannelHandler(SSLContext sslContext, SocketChannel socketChannel) {
            super(socketChannel, sslContext, false, 1500, 15000, 1000);

            SSLEchoServerTransformer sslEchoServerTransformer = new SSLEchoServerTransformer();
            sslInputForwarder.setNextForwarder(sslEchoServerTransformer);
            sslEchoServerTransformer.setNextForwarder(byteBufferToArrayForwarder);
        }

        @Override
        public void inputClosed() {
            //System.out.println("SSLEchoClient closed the connection.");
        }

        @Override
        public void channelException(Exception exception) {
            //log.error("Exception", exception);
        }
    }

    private static class SSLEchoServerTransformer extends AbstractForwarder<ByteBuffer, ByteBuffer> {
        @Override
        public void forward(ByteBuffer input) throws IOException {
            executor.execute(new Processing(input, nextForwarder));
        }
    }
}

При поступлении данных вызывается метод forward класса SSLEchoServerTransformer
PM MAIL   Вверх
HugeX
Дата 29.6.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 19.9.2009

Репутация: нет
Всего: нет



Решил проблему переходом на Apache MINA smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.