我正在从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;
}
答案 0 :(得分:1)
你有两个潜在的问题:
Web服务器未启动。确保它已启动并且http://localhost:8008/context/servleturl在您的Web浏览器中正常工作。
除此之外,通常的做法是不对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序列化?