2011-11-26 183 views
0

嘿,我stucked的问题只是登录Java在发送http请求时java.io.EOFException?

这里是我的servlet

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.sql.DataSource; 

/** 
* 
* @author amolbh 
*/ 
public class AreaServlet extends HttpServlet { 

    private Connection connection = null; 
    private PreparedStatement prepStmt=null; 
    private String farid,password,farid1; 
    private ResultSet rst=null; 



    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      if(request.getServletPath().equals("/login")) 
       loginValidation(request,response); 

     } finally { 
      out.close(); 
     } 
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    /** 
    * Returns a short description of the servlet. 
    * @return a String containing servlet description 
    */ 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 



    public void loginValidation(HttpServletRequest request, HttpServletResponse response)throws IOException 
    { 
     DataInputStream in = new DataInputStream((InputStream)request.getInputStream()); 
     byte indata[] = new byte[request.getContentLength()]; 
     in.readFully(indata,0,indata.length); 
     in = new DataInputStream(new ByteArrayInputStream(indata)); 
     farid = in.readUTF(); 
     password = in.readUTF(); 

     DataOutputStream daos = new DataOutputStream((OutputStream)response.getOutputStream()); 

     String s1,s2; 

     ByteArrayOutputStream baosdata = new ByteArrayOutputStream(); 
     DataOutputStream doasdata = new DataOutputStream(baosdata); 


     try 
     { 
      connection=getConnection(); 
      prepStmt=connection.prepareStatement("Select Username,Password from Login "); 
      rst=prepStmt.executeQuery(); 

      int c = 0; 

      while(rst.next()) 
      { 

       s1=rst.getString(1); 
       s2=rst.getString(2); 
       doasdata.writeUTF(s1); 
       doasdata.writeUTF(s2); 
       c++; 

      } 

      ByteArrayOutputStream baoshdata = new ByteArrayOutputStream(); 
      DataOutputStream doashdata = new DataOutputStream(baoshdata); 
      if(c != 0) 
      { 
       doashdata.writeUTF("successfull"); 
       // doashdata.writeInt(c); 
       doashdata.write(baosdata.toByteArray()); 
       daos.write(baoshdata.toByteArray()); 
      } 
      else{ 
       doashdata.writeUTF("Invalid User"); 

      daos.write(baoshdata.toByteArray()); 
      } 

     } 
     catch(Exception e) 
     { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      DataOutputStream daose = new DataOutputStream(baos); 
      daose.writeUTF(e.toString()); 
      daos.write(baos.toByteArray()); 
     } 


    } 

    public Connection getConnection() throws NamingException, SQLException 
    { 
     try { 
      /*InitialContext ic=new InitialContext(); 
      * DataSource ds=(DataSource)ic.lookup("java:comp/env/jdbc/ImageCapture"); 
      * connection = ds.getConnection(); 
      * return connection;*/ 

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      // Step 2: Establish the connection to the database. 
      String url = "jdbc:odbc://localhost:8080/ImageCapture"; 
      Connection conn = DriverManager.getConnection(url); 
      return conn; 

     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

} 

和LoginSrv课堂,我得到疗法性反应

抵达 “javaioEOF例外” EXCEPTION AT 字符串苏= indat.readUTF();

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package com.marico.model; 

import com.sun.lwuit.Dialog; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import com.marico.esaff.AppConstants; 
/** 
* 
* @author sandipp 
*/ 
public class LoginSrv { 
    private ServCon srv; 
    public static String st1,st2,log,pas; 
    public static int it1; 

    public LoginSrv(String s1, String s2) 
    { 
     log = s1; 
     pas = s2; 
     it1=0; 
     try 
     { 
      Dialog.show("Successfull","i am in Loginsrv" , null,Dialog.TYPE_INFO,null,3000); 
      ByteArrayOutputStream baosdata = new ByteArrayOutputStream(); 
      DataOutputStream daosdata = new DataOutputStream(baosdata); 

      daosdata.writeUTF(s1); 
      daosdata.writeUTF(s2); 
      srv = new ServCon(new AppConstants().str1,null,baosdata.toByteArray(),false,false,null); 
      ByteArrayOutputStream obj = (ByteArrayOutputStream)srv.startTransfer(); 
      byte[] record = obj.toByteArray(); 
      ByteArrayInputStream instr = new ByteArrayInputStream(record); 
      DataInputStream indat = new DataInputStream(instr); 

      if(srv.getRc() == 200) 
      { 
       Dialog.show("Successfull","i am in Loginsrv "+srv.getRc() , null,Dialog.TYPE_INFO,null,3000); 
       String su = indat.readUTF(); 
       // if(su.equals("successfull")) 
       { 

        st1 =indat.readUTF(); 
        st2 =indat.readUTF(); 
        System.out.println("st1 and st2 "+ st1 + " , "+st2); 
        Dialog.show("Successfull",su , null,Dialog.TYPE_INFO,null,3000); 
       } 
       // else 
       { 
        // Dialog.show("Error",su , null,Dialog.TYPE_INFO,null,5000); 

       } 
      } 
      else 
      { 
       Dialog.show("Error",srv.getRc() + " " + srv.getRm(), null,Dialog.TYPE_INFO,null,5000); 

      } 
     } 
     catch(Exception e) 
     { 
      Dialog.show("Error","I am in catch "+e.toString(), null,Dialog.TYPE_INFO,null,5000); 
      System.out.println("Im from LoginSrv constructor: "+e); 
     } 

    } 

} 

这里ServCon.java我在哪里做连接

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package com.marico.model; 
import com.sun.lwuit.Dialog; 
import com.sun.lwuit.util.Resources; 
import com.sun.lwuit.Label; 
import javax.microedition.io.Connector; 
import javax.microedition.io.HttpConnection; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.OutputStream; 

/** 
* 
* @author sandipp 
*/ 
public class ServCon { 
    private String url,sendparam,indata; 
private byte sendparamb[]; 
private boolean instring,outstring; 
private String error; 
private int rc; 
private String rm; 
private Resources r; 
//private View.DisplayProgress dp; 

public static com.sun.lwuit.TextArea textobj; 
    public ServCon(String url,String sendparam,byte[]sendparamb,boolean instring,boolean outstring,Resources r) 
{ 
    this.url = url; 
    this.instring = instring; 
    this.outstring = outstring; 
    this.r = r; 
    //this.dp = dp; 
    if(this.instring) 
    { 
     this.sendparam = sendparam; 
    } 
    else 
    { 
     this.sendparamb = sendparamb; 
    } 
} 
public Object startTransfer() throws Exception 
{ 


     HttpConnection c = (HttpConnection)Connector.open(url); 
     c.setRequestProperty("User-Agent","Profile/MIDP-1.0, Configuration/CLDC-1.0"); 
     c.setRequestProperty("Content-Language","en-US"); 
     c.setRequestMethod(HttpConnection.POST); 
     DataOutputStream os = (DataOutputStream)c.openDataOutputStream(); 



     if(instring) 
      os.writeUTF(sendparam); 
     else 
      os.write(sendparamb,0,sendparamb.length); 

     rc = c.getResponseCode();//getResponseCode(); 
     rm = c.getResponseMessage(); 
     int len = (int)c.getLength(); 
     System.out.println(getRm() + " " + len); 

     DataInputStream is =(DataInputStream)c.openDataInputStream(); 

     Object outobj = null; 
     if(outstring) 
     { 
      StringBuffer rdata = new StringBuffer(); 
      int ch; 

      while ((ch = is.read()) != -1) 
      { 
       rdata.append((char)ch); 
      } 

      indata = rdata.toString(); 
      outobj = indata; 
     } 
     else 
     { 

      sendparamb = new byte[len]; 
      is.readFully(sendparamb,0,sendparamb.length); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      DataOutputStream dout = new DataOutputStream((OutputStream)baos); 
      dout.write(sendparamb, 0, sendparamb.length); 
      outobj = baos; 
     } 

     is.close(); 
     c.close(); 
     os.flush(); 
     os.close(); 

     System.out.println("Reached at the end of the httpdatafetch"); 
     return outobj; 



} 
     /** 
    * @return the rc 
    */ 
    public int getRc() { 
     return rc; 
    } 
    /** 
    * @return the rm 
    */ 
    public String getRm() { 
     return rm; 
    } 





} 
+0

请添加stacktrace –

+1

这真是一团糟。为什么不使用HTTP以普通的方式使用POST请求参数等?另见http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests – BalusC

回答

2

发信人你已经基本上后面的字节数组两个write()小号writeUTF("successfull")。在接收器中,你基本上有if readUTF() == "successfull",那么如果是这样,你再做两个readUTF() s。但readUTF()只能读取writeUTF()写的内容:请参阅Javadoc。它肯定无法读取write()与任意byte[]数组的结果。你需要理清你的应用协议实际是什么。

您也有太多ByteArrayInputStream s和ByteArrayOutputStream s我喜欢。这些只会增加延迟和上述错误的机会。如果您有要写的内容,请将其直接写入输出流;如果您认为自己有需要阅读的东西,请从输入流中读取它。