Получение Applets OutputStream вызывает исключение: что не так? - PullRequest
0 голосов
/ 12 февраля 2011

Я создал апплет, в котором я пытаюсь получить объекты URLConnection выходной поток , используя conn.getOutputStream (); .Когда я пытаюсь это сделать, мой апплет выдает исключение java.net.UnknownServiceException: протокол не поддерживает вывод .

Что идет не так и как я могу это исправить?Это была проблема, с которой я сталкивался некоторое время, и я действительно подчеркиваю, потому что я не понимаю, что именно не так и как я могу это исправить.

Некоторая важная справочная информация.Я открываю и запускаю свой апплет, открывая файл HTML, который загружает апплет.Апплет успешно загружается и создает все свои JComponents.При попытке получить выходной поток я получаю исключение, о котором я упоминал выше.

Вывод, отображаемый в моем апплете при запуске в браузере:

Путь: файл: /C: / Пользователи / Soribo / Рабочий стол / Веб-сайт / Тестирование / Подключение (): Ошибка: java.net.UnknownServiceException: протокол не поддерживает вывод

Мой код:

public class TestApplet extends JApplet
{
    JTextArea displayTf;

    public TestApplet()
    {

    }

    public void init() 
    {
        try 
        {
            SwingUtilities.invokeAndWait( new Runnable() {
                public void run()
                {
                    initComponents();
                    connect();
                }
            });
        } 
        catch (InterruptedException e) { e.printStackTrace(); } 
        catch (InvocationTargetException e) { e.printStackTrace(); }
    }

    public void stop() {}
    public void destroy() {}
    public void start() {}

    public void initComponents()
    {
        JPanel mainPanel = (JPanel) getContentPane();
        displayTf = new JTextArea( "" );

        mainPanel.add( displayTf );
    }

    public void connect()
    {
        try
        {
            displayTf.setText( displayTf.getText() + "\nPath: " + getCodeBase() ); // In the browser it displays 'file:/c:/.../TestApplet/bin'
            URL servletUrl = new URL( getCodeBase(), "TestApplet" );               // My applet's class file name is TestApplet.class
            URLConnection conn = servletUrl.openConnection();

            conn.setDoInput( true );
            conn.setDoOutput( true );
            conn.setUseCaches( false );
            conn.setDefaultUseCaches (false);
            conn.setRequestProperty ("Content-Type", "application/octet-stream"); // Set the content type to indicate that we're sending binary data

            OutputStream out = conn.getOutputStream();  // EXCEPTION thrown here java.net.UnknownServiceException: protocol doesn't support output

            // Some tests I have done
            // conn.setRequestProperty( "Content-Type", "application/x-java-serialized-object" );
            // conn.setRequestProperty("Authorization", "Basic " + encode("uidPassword"));
            // System.setProperty("http.proxyHost", "proxy.example.com"); 
            // System.setProperty("http.proxyPort", "8080"); 

        }
        catch ( IOException e )
        {
            displayTf.setText( displayTf.getText() + "\nIn connect(): Failure: " + e );
        }
    }

Ответы [ 2 ]

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

file: URL-адреса не поддерживают запись в них.

Когда ваша страница апплета находится на веб-сервере, у вас будет http: URL-адрес, который поддерживает запись - но он будет работать толькоесли кто-то на стороне сервера принимает запрос (скорее всего, POST или PUT, не знаю).

0 голосов
/ 23 июля 2011

Как сказал Паŭло Эберманн, проблема заключается в типе Url: если тип файла во время выполнения - файл, вы сможете писать или читать в Stream.И, очевидно, вы пытаетесь использовать OutputStream из вашего URL.

У меня была та же проблема, и после некоторого стресса я понял причину: класс Applet (в вашем случае "TestApplet.class") находится вне досягаемости вашего веб-приложения и веб-сервера. Во время выполнения URL-адресразрешается в виде файла ("file: //") вместо ресурсов веб-приложения или страницы ("http://").

Мое решение было переместить мой класс Applet внутрь (натого же уровня, что и содержащий html-файл) каталога Web-Content, так что он будет рассматриваться как ресурс Web-приложений, а затем сможет отправлять какой-либо запрос / ответ сервлета с вашим Output / InputStream.

просто переместите свой класс Applet в каталог веб-контента и запустите свой сервлет не из файловой системы (url: file: //), а с вашего веб-сервера (url: http://)

)
...