При отправке объекта сервлету выдается ошибка, которую не удается устранить. - PullRequest
1 голос
/ 10 февраля 2011

Я отправляю строку из апплета в сервлет.Когда я иду, чтобы получить поток вывода от URLConnection, я получаю исключение java.net.UnknownServiceException: протокол не поддерживает вывод

Некоторая справочная информация;Я использую Eclipse, я протестировал апплет, запустив его в eclipse и на моей собственной html странице, и они выдают ту же ошибку.Я скачал правильный Java Web SDK.Может быть, мне нужно настроить сервер hxxp: // 8008 ...?

Почему это происходит и как я могу это исправить?Нужно ли подписывать мой апплет, чтобы он работал?

Вот мой код, и я прокомментировал, где выбрасывается исключение:

public String messageServlet()
{
    try
    {
        URLConnection conn = connectToServlet();
        conn.setDoOutput(true);
        OutputStream out = conn.getOutputStream();  // Exception thrown here: UnknownServiceException: protocol doesn't support output
        ObjectOutputStream objOut = new ObjectOutputStream( out );
        objOut.writeObject( message );
        objOut.flush();
        objOut.close();

        System.out.println( "1" ); 

        // receive result from servlet
        InputStream instr = conn.getInputStream();
        ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
        String result = (String) inputFromServlet.readObject();
        inputFromServlet.close();
        instr.close();
        System.out.println( "1" );
        return result;
    }
    catch ( IOException e )
    {
        System.out.println( "In messageServlet(): " + e );
        msgBox.setText( msgBox.getText() + "\nIn messageServlet(): " + e );
    }
    catch ( Exception e )
    {
        System.out.println( "In messageServlet(): " + e );
        msgBox.setText( msgBox.getText() + "\nIn messageServlet(): " + e );
    }

    return null;
}

public URLConnection connectToServlet()
{
    try
    {
        URL servletUrl = new URL( getCodeBase(), "echo" );
        URLConnection conn = servletUrl.openConnection();

        conn.setDoInput( true );
        conn.setDoOutput( true );
        conn.setUseCaches( false );
        conn.setRequestProperty( "Content-Type", "application/x-java-serialized-object" );

        return conn;
    }
    catch ( IOException e )
    {
        System.out.println( "In connectToServlet(): " + e );
    }

    return null;
}

1 Ответ

1 голос
/ 10 февраля 2011

У вас две потенциальные проблемы:

  1. Веб-сервер не запущен.Убедитесь, что он запущен и что http://localhost:8008/context/servleturl отлично работает в вашем браузере.

  2. Вы использовали неправильный URL.Схема hxxp не имеет смысла.Это http.


Помимо всего этого, обычной практикой является , а не жесткое кодирование базового домена в вашем апплете., это сделает его непереносимым (вам придется исправлять / изменять его каждый раз, когда вы перемещаете домены).Просто получите его от унаследованного Applet#getCodeBase() метода.Используйте это как базу для вашего URL сервлета.

URL servlet = new URL(getCodeBase(), "servleturl");
// ...

Здесь getCodeBase(), таким образом, возвращается как http://localhost:8008/context.


Опять же, кроме всего этого, я бы предпочелотправка открытого текста, формата JSON или XML через HTTP поверх двоичных данных, специфичных для Java.Это лучше использовать повторно и легче до / пост-обработки.У вас есть несколько символов в строке, которые вы хотите отправить туда и обратно.Просто отправьте его как параметр HTTP-запроса и позвольте сервлету захватить его на request.getParameter() и так далее.Зачем вам для этого использовать сериализацию Java?

...