applet servlet通信

时间:2011-08-21 09:23:53

标签: java applet io client-server

我正在尝试在jsp中读取xml并通过网络将其作为char []传递给applet但我得到了 java.io.StreamCorruptedException:无效的流标题:3C3F786D

我的jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %> 
<%@ page import = "java.io.*" %> 
<%@ page trimDirectiveWhitespaces="true" %> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<%  String xmlname=(String)request.getAttribute("xmlname");
     int ch;    
    System.out.println("the value of the xml is "+xmlname);
    String filepath="C:/Users/ashutosh_k/idoc/docRuleTool/WebContent/data/Malaria.xml";
    FileReader fis = new FileReader(new File(filepath));
    char bin[] = new char[(int) new File(filepath).length()];
    fis.read(bin);
    response.getWriter().write(bin);
    fis.close();
%>
</body>
</html>

我的小程序代码:

package com.vaannila.utility;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import prefuse.util.ui.JPrefuseApplet;

public class dynamicTreeApplet extends JPrefuseApplet {

    private static final long serialVersionUID = 1L;
    public static int i = 1;

    public void init() {
        System.out.println("the value of i is " + i);
        URL url = null;
        try {
            url = new URL("http://localhost:8080/docRuleTool/XmlResponseReading.jsp");
            URLConnection con = url.openConnection();
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            //con.setRequestProperty("Content-TYpe", "application/octet-stream");
            ObjectOutputStream oos =  new ObjectOutputStream(con.getOutputStream());
            oos.writeObject("Malaria");
            oos.flush();
            oos.close();
            InputStream ois =  con.getInputStream();
        //  ByteArrayOutputStream bos = new ByteArrayOutputStream();
            while (true) {
                byte b[] = new byte[1024];
                int retval = ois.read(b);
                if (retval < b.length) {
                    if (retval > 0) {
                        byte b1[] = new byte[retval];
                        System.arraycopy(b, 0, b1, 0, retval);

                        ois.read(b1);
                        System.out.println(new String(b1));
                    }
                    break;
                } else {
                    ois.read(b);
                    System.out.println(new String(b));

                }

            }

//          ByteArrayInputStream bis = new ByteArrayInputStream(ois.toByteArray());
            this.setContentPane(dynamicView.demo(ois, "name"));
            ois.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException f) {
            f.printStackTrace();

        } catch (IOException io) {
            io.printStackTrace();
        }
        ++i;
    }

}

2 个答案:

答案 0 :(得分:0)

您需要为服务器上的响应设置上下文类型为“text / xml”。

答案 1 :(得分:0)

您的代码中存在许多问题:

  • 您正在将HTML页面中的XML发送到您的客户端。你的XML不应该有HTML标记。否则它不再是XML了。
  • 您正在使用JSP中的scriptlet。 JSP应该用于生成标记,而不是其他任何东西。将读取请求参数,读取文件等的代码放在servlet中,其中Java代码可以正确编写,解析,重构和设计,而不是在JSP中。 JSP应包含标记,JSP标记和EL表​​达式。不是Java代码。
  • 您正在使用platforme默认编码来读取XML文件,该文件可能以其他编码方式编码。您应该将XML文件作为字节读取,并将其发送到响应OutputStream。 XML文件定义了它的编码,因此接收者的XML解析器可以使用适当的编码将字节流转换为XML文档
  • 您没有正确读取文件。对fis.read的单次调用不保证已读取整个文件。阅读您正在使用的方法的javadoc,并阅读关于IO的Java教程。
  • 您正在使用ObjectOutputStream发送HTTP请求参数。 ObjectOutputStream用于发送序列化对象。它不用于发送HTTP参数。 URL应为http://localhost:8080/docRuleTool/XmlResponseReading.jsp?xmlname=Malaria,您不应在连接的输出流中发送任何内容。您应该了解HTTP的工作原理。
  • 从输入流(在applet中)读取的代码也是错误的。阅读关于IO的Java教程。
  • 再一次,在applet中,您使用默认平台编码将字节数组转换为String。使用XML解析器来读取XML。