将对象发送到Servlet会抛出我无法解决的错误

时间:2011-02-09 21:45:03

标签: java servlets applet

我正在从Applet向Servlet发送一个字符串。当我从URLConnection获取输出流时,我得到抛出的异常 java.net.UnknownServiceException:protocol不支持输出

一些背景信息;我正在使用Eclipse,我通过在eclipse和amp;中运行它来测试applet。在我自己的html页面中,我制作了&他们抛出同样的错误。我已经下载了正确的Java Web SDK。也许我需要设置我的hxxp:// 8008 ...服务器?

为什么会这样?&我该怎么解决?我是否需要签署我的applet以使其正常工作?

这是我的代码&我已经评论了抛出异常的地方:

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 个答案:

答案 0 :(得分:1)

你有两个潜在的问题:

  1. Web服务器未启动。确保它已启动并且http://localhost:8008/context/servleturl在您的Web浏览器中正常工作。

  2. 您使用了错误的网址。 hxxp计划毫无意义。这是http


  3. 除此之外,通常的做法是对applet中的基本域进行硬编码,这会使其无法移植(每次移动域时都需要修复/更改它)。只需从继承的Applet#getCodeBase()方法中获取它。使用它作为servlet URL的基础。

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

    此处getCodeBase()因此返回http://localhost:8008/context


    除此之外,我更喜欢通过HTTP在特定于Java的二进制数据上发送明文,JSON或XML格式。它更易于重复使用,更易于预处理/后处理。你有一些字符串,你想要发送和返回。只需将其作为HTTP请求参数发送,让servlet通过request.getParameter()抓取它,依此类推。为什么你会为此使用Java序列化?