我创建了一个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 );
}
}
答案 0 :(得分:1)
file:
网址不支持写入。
当您的小程序页面位于网络服务器上时,您将拥有一个支持写入的http:
网址 - 但只有在服务器端有人接受请求时才会有效(可能是POST或PUT,不知道。)
答案 1 :(得分:0)
我遇到了同样的问题,经过一些压力之后,我理解了原因: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://)