获取Applet OutputStream会抛出异常:出了什么问题?

时间:2011-02-12 01:37:35

标签: java servlets applet

我创建了一个applet,我尝试使用 conn.getOutputStream(); 检索URLConnection对象输出流。当我尝试这样做时,我的applet抛出异常 java.net.UnknownServiceException:protocol不支持输出

出了什么问题&我怎样才能解决这个问题?这一直是我一直处理的一个问题。我真的很强调,因为我不明白到底出了什么问题。我该如何解决它。

一些重要的背景资料。我打开&通过打开加载applet的HTML文件来运行我的applet。小程序成功加载&创建所有JComponents。在尝试获取输出流时,我得到了上面提到的异常。

在浏览器中运行时,我的applet中显示的输出:

  

路径:文件:/ C:/ Users / Soribo / Desktop / Website / Test /   在connect()中:失败: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 个答案:

答案 0 :(得分:1)

file:网址不支持写入。

当您的小程序页面位于网络服务器上时,您将拥有一个支持写入的http:网址 - 但只有在服务器端有人接受请求时才会有效(可能是POST或PUT,不知道。)

答案 1 :(得分:0)

像PaŭloEbermann所说的那样,问题在于Url类型:如果文件类型在运行时是一个文件,那么你将能够在Stream中读取或编写。显然,您尝试使用Url中的OutputStream。

我遇到了同样的问题,经过一些压力之后,我理解了原因:Applet类(在您的情况下为“TestApplet.class”)位于您的webapp和webserver的范围之外。在运行时,Url被解析为file(“file://”)而不是web-app资源或页面(“http://”)。

我的解决方案是移动我的Applet类(在包含的html文件的同一级别)的Web内容目录,以便它被视为Web应用程序资源,并且然后能够发送一些servlet请求/响应,它将具有您的Output / InputStream。

只需将您的Applet类移动到Web内容目录,然后启动您的Servlet,而不是从文件System(url:file://)启动,而是 来自您的网络服务器(网址:http://)