Получить входной поток в апплете - PullRequest
0 голосов
/ 12 февраля 2011

Я экспериментирую с Java-апплетами и общаюсь между сервлетом и апплетом. При попытке получить входной поток из моего объекта URLConnection возникает ошибка HTTP 501.

Я знаю, что ошибка 501 означает, что я пытаюсь выполнить действие, для которого соединение не было настроено (в моем случае операция GET), но я подумал, что мой код ниже принимает входные данные, потому что я говорю conn.setDoInput (true ); .

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

Ошибка:

In messageServlet (): Сбой: java.io.IOException: сервер вернул код ответа HTTP: 501 для URL: http: //localhost:8000/TestServlet.class

Мой код приведен ниже (я прокомментировал, где выбрасывается исключение), также, если вам интересно, http: // localhost: 8000 - это moch-сервер, который я настроил со скриптом python и который работает, потому что подключение и получение поток вывода не выдает исключение.

//this code occurs in my class TextApplet::messageServlet() 
//I am attempting to send a string to my servlet class TestServlet, 
//then read a string that the servlet sends back
try
{
    URL servletUrl = new URL( "http://localhost:8000/TestServlet.class" ); 
 URLConnection conn = servletUrl.openConnection();

    conn.setDoInput( true );
    conn.setDoOutput( true );
    conn.setUseCaches( false );
    conn.setDefaultUseCaches (false);
    conn.setRequestProperty ("Content-Type", "application/octet-stream");           
    OutputStream out = conn.getOutputStream();

    out.write( message.getBytes() );                              
    out.flush();
    out.close();

    // receive result from servlet
    InputStream in = conn.getInputStream(); // Exception Occurs HERE            
    BufferedReader reader = new BufferedReader(new InputStreamReader( in ));            
 String result = reader.readLine();                            
 in.close();

    return result;
}
catch ( IOException e )
{
    System.out.println( "In messageServlet(): " + e );
    msgBox.setText( msgBox.getText() + "\nIn messageServlet(): Failure: " + e );
}
catch ( Exception e )
{
    System.out.println( "In messageServlet(): " + e );
    msgBox.setText( msgBox.getText() + "\nIn messageServlet(): Failure: " + e );
}

return null;
}       

Ответы [ 2 ]

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

Ошибка HTTP 501 означает, что сервер (по крайней мере, встроенный сервлет по умолчанию в servletcontainer) не понимает HTTP-запрос при его создании.Это может быть вызвано неправильными заголовками и / или телом.

Я не уверен, что происходит, но один URL http://localhost:8000/TestServlet.class выглядит далеко не так.Это похоже на то, что вы удалили необработанный файл .class в общедоступную папку веб-контента и пытаетесь получить к нему доступ.Это не имеет никакого смысла.Классы сервлетов должны быть помещены в папку /WEB-INF/classes (внутри пакета!), А URL-адрес для запуска сервлета должен быть определен в <url-pattern> файла /WEB-INF/web.xml.

См. Также


Вне зависимости от конкретной проблемы, я бы предпочел использовать Applet#getCodeBase() для получения URL базы кода (там, гдеапплет был загружен с) вместо жесткого кодирования в URL.Предполагая, что сервлет сопоставлен с шаблоном URL-адреса /myservlet в web.xml файле, необходимо создать URL-адрес в апплете следующим образом:

URL url = new URL(getCodeBase(), "myservlet");
// ...
0 голосов
/ 12 февраля 2011

Если вы получили ошибку 5XX, причина на стороне сервера.Проверьте журналы вашего приложения.сервер - вы увидите исключение, выданное из вашего сервлета, которое объяснит, где проблема.

...