2016-04-06 1 views
0

J'ai eu affaire à un problème qui ne cesse de revenir et je suis très frustré. J'essaie de me connecter à ma base de données via un template webservice php que j'ai trouvé en ligne, en lui envoyant JSONObjects. Je reçois toujours une exception IOException ou ProtocolException lorsque j'essaie d'obtenir un code de réponse du serveur avec la cause «Fin de flux inattendue». Le message d'erreur est vraiment énigmatique et je n'ai aucune idée que l'erreur est dans le Java ou le code PHP. J'ai posté le code, vous pouvez jeter un oeil:ProtocolException: fin inattendue du flux

Trace de la pile:

java.net.ProtocolException: unexpected end of stream 
 
    at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.java:314) 
 
    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:781) 
 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:443) 
 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388) 
 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:501) 
 
    at ske.matej.project.JSONParser.getJSONFromUrl(JSONParser.java:56) 
 
    at ske.matej.project.UserFunctions.loginUser(UserFunctions.java:35) 
 
    at ske.matej.project.LoginActivity$AttemptLogin.doInBackground(LoginActivity.java:145) 
 
    at ske.matej.project.LoginActivity$AttemptLogin.doInBackground(LoginActivity.java:121) 
 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
 
    at java.lang.Thread.run(Thread.java:818)

JSONParser.java (je marque la ligne incriminée avec un commentaire)

import android.util.Log; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.URL; 


public class JSONParser { 

    private JSONObject jsonObj = new JSONObject(); 
    private JSONObject json = new JSONObject(); 
    private String email; 
    private String username; 
    private String password; 
    private int objLength; 
    private static InputStream is = null; 

    public JSONParser() { 
     //Default constructor intentionally left empty for now 
    } 

    public JSONObject getJSONFromUrl(String _url, JSONObject params) { 

     // Making HTTP request 
     try { 
      URL url = new URL(_url); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

      byte[] bytearray = params.toString().getBytes("UTF-8"); 

      conn.setDoOutput(true); 
      conn.setDoInput(true); 
      conn.setRequestMethod("POST"); 
      conn.setFixedLengthStreamingMode(bytearray.length); 
      //conn.setRequestProperty("User-Agent", "GYUserAgentAndroid"); 
      conn.setRequestProperty("Content-Length", Integer.toString(bytearray.length)); 
      conn.setRequestProperty("Content-Type", "application/json"); 
      //conn.setUseCaches(false); 

      System.out.println("Byte array length: "+bytearray.length); 

      //The offending line     
      int responseCodeHTTP = conn.getResponseCode(); 

      System.out.println("Responsecode HTTP "+responseCodeHTTP); 

      OutputStream os = conn.getOutputStream(); 
      os.write(bytearray); 
      os.flush(); 

      if (responseCodeHTTP == HttpURLConnection.HTTP_OK) { 
       try { 
        is = new BufferedInputStream(conn.getInputStream()); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(
          is, "UTF-8"), 8); 
        StringBuilder sb = new StringBuilder(); 
        String line = null; 
        while ((line = reader.readLine()) != null) { 
         sb.append(line); 
        } 
        is.close(); 
        json = new JSONObject(sb.toString()); 
        Log.e("JSON", json.toString()); 
       } 
       catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return json; 

    } 

    public byte[] getJSONBytes() { 
     try { 
      return jsonObj.toString().getBytes("UTF-8"); 
     } 
     catch(UnsupportedEncodingException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

index .php (je n'ai pas encore beaucoup changé dans le code, je veux juste établir une connexion pour le moment)

<?php 
 
    
 
if($_POST != null) { 
 
\t 
 
\t echo json_encode("Status: 200"); 
 
\t 
 
\t if (isset($_POST['tag']) && $_POST['tag'] != '') { 
 
    // Get tag 
 
    $tag = $_POST['tag']; 
 
    
 
    // Include Database handler 
 
    require_once 'DB_Functions.php'; 
 
    $db = new DB_Functions(); 
 
    // response Array 
 
    $response = array("tag" => $tag, "success" => 0, "error" => 0); 
 
    
 
    // check for tag type 
 
    if ($tag == 'login') { 
 
     // Request type is check Login 
 
     $email = $_POST['email']; 
 
     $password = $_POST['password']; 
 
    
 
     // check for user 
 
     $user = $db->getUserByEmailAndPassword($email, $password); 
 
\t \t 
 
\t \t 
 
\t \t //FOR TESTING PURPOSES: REMOVE LATER 
 
\t \t $user = false; 
 
\t \t 
 
\t \t 
 
     if ($user != false) { 
 
      // user found 
 
      // echo json with success = 1 
 
      $response["success"] = 1; 
 
      $response["user"]["fname"] = $user["firstname"]; 
 
      $response["user"]["lname"] = $user["lastname"]; 
 
      $response["user"]["email"] = $user["email"]; 
 
     $response["user"]["uname"] = $user["username"]; 
 
      $response["user"]["uid"] = $user["unique_id"]; 
 
      $response["user"]["created_at"] = $user["created_at"]; 
 
    
 
      echo json_encode($response); 
 
     } else { 
 
      // user not found 
 
      // echo json with error = 1 
 
      $response["error"] = 1; 
 
      $response["error_msg"] = "Incorrect email or password!"; 
 
      echo json_encode($response); 
 
     } 
 
    } 
 
    else if ($tag == 'chgpass'){ 
 
    $email = $_POST['email']; 
 
    
 
    $newpassword = $_POST['newpas']; 
 
    
 
    $hash = $db->hashSSHA($newpassword); 
 
     $encrypted_password = $hash["encrypted"]; // encrypted password 
 
     $salt = $hash["salt"]; 
 
    $subject = "Change Password Notification"; 
 
     $message = "Hello User,nnYour Password is sucessfully changed.nnRegards,nLearn2Crack Team."; 
 
      $from = "[email protected]"; 
 
      $headers = "From:" . $from; 
 
    if ($db->isUserExisted($email)) { 
 
    
 
$user = $db->forgotPassword($email, $encrypted_password, $salt); 
 
if ($user) { 
 
     $response["success"] = 1; 
 
      mail($email,$subject,$message,$headers); 
 
     echo json_encode($response); 
 
} 
 
else { 
 
$response["error"] = 1; 
 
echo json_encode($response); 
 
} 
 
    
 
      // user is already existed - error response 
 
    
 
     } 
 
      else { 
 
    
 
      $response["error"] = 2; 
 
      $response["error_msg"] = "User not exist"; 
 
      echo json_encode($response); 
 
    
 
} 
 
} 
 
else if ($tag == 'forpass'){ 
 
$forgotpassword = $_POST['forgotpassword']; 
 
    
 
$randomcode = $db->random_string(); 
 
    
 
$hash = $db->hashSSHA($randomcode); 
 
     $encrypted_password = $hash["encrypted"]; // encrypted password 
 
     $salt = $hash["salt"]; 
 
    $subject = "Password Recovery"; 
 
     $message = "Hello User,nnYour Password is sucessfully changed. Your new Password is $randomcode . Login with your new Password and change it in the User Panel.nnRegards,nLearn2Crack Team."; 
 
      $from = "[email protected]"; 
 
      $headers = "From:" . $from; 
 
    if ($db->isUserExisted($forgotpassword)) { 
 
    
 
$user = $db->forgotPassword($forgotpassword, $encrypted_password, $salt); 
 
if ($user) { 
 
     $response["success"] = 1; 
 
      mail($forgotpassword,$subject,$message,$headers); 
 
     echo json_encode($response); 
 
} 
 
else { 
 
$response["error"] = 1; 
 
echo json_encode($response); 
 
} 
 
    
 
      // user is already existed - error response 
 
    
 
     } 
 
      else { 
 
    
 
      $response["error"] = 2; 
 
      $response["error_msg"] = "User not exist"; 
 
      echo json_encode($response); 
 
    
 
} 
 
    
 
} 
 
else if ($tag == 'register') { 
 
     // Request type is Register new user 
 
     $fname = $_POST['fname']; 
 
     $lname = $_POST['lname']; 
 
     $email = $_POST['email']; 
 
     $uname = $_POST['uname']; 
 
     $password = $_POST['password']; 
 
    
 
     // check if user is already existed 
 
     if ($db->isUserExisted($email)) { 
 
      // user is already existed - error response 
 
      $response["error"] = 2; 
 
      $response["error_msg"] = "User already existed"; 
 
      echo json_encode($response); 
 
     } 
 
      else if(!$db->validEmail($email)){ 
 
      $response["error"] = 3; 
 
      $response["error_msg"] = "Invalid Email Id"; 
 
      echo json_encode($response); 
 
} 
 
else { 
 
      // store user 
 
      $user = $db->storeUser($fname, $lname, $email, $uname, $password); 
 
      if ($user) { 
 
       // user stored successfully 
 
      $response["success"] = 1; 
 
      $response["user"]["fname"] = $user["firstname"]; 
 
      $response["user"]["lname"] = $user["lastname"]; 
 
      $response["user"]["email"] = $user["email"]; 
 
     $response["user"]["uname"] = $user["username"]; 
 
      $response["user"]["uid"] = $user["unique_id"]; 
 
      $response["user"]["created_at"] = $user["created_at"]; 
 
       mail($email,$subject,$message,$headers); 
 
    
 
       echo json_encode($response); 
 
      } else { 
 
       // user failed to store 
 
       $response["error"] = 1; 
 
       $response["error_msg"] = "JSON Error occured in Registartion"; 
 
       echo json_encode($response); 
 
      } 
 
     } 
 
    } else { 
 
     $response["error"] = 3; 
 
     $response["error_msg"] = "JSON ERROR"; 
 
     echo json_encode($response); 
 
    } 
 
} else { 
 
    echo ""; 
 
} 
 
} 
 
    
 
?>

J'apprécie vraiment toute aide que vous pouvez donner. Surtout parce que je suis toujours un Noob dans le développement Android et PHP.

Répondre

0

changer ceci:

//The offending line     
     int responseCodeHTTP = conn.getResponseCode(); 

     System.out.println("Responsecode HTTP "+responseCodeHTTP); 

     OutputStream os = conn.getOutputStream(); 
     os.write(bytearray); 
     os.flush(); 

à:

 OutputStream os = conn.getOutputStream(); 
     os.write(bytearray); 
     os.flush(); 

//not any more offending line     
      int responseCodeHTTP = conn.getResponseCode(); 

      System.out.println("Responsecode HTTP "+responseCodeHTTP); 
+1

Je crains que cela ne fonctionne pas. 'java.io.IOException: fin de flux inattendue sur Connection {192.168.1.146:3306, proxy = DIRECT @ hostAddress = 192.168.1.146 cipherSuite = aucun protocole = http/1.1} (recycle count = 0)' sur la même ligne – MatejS

+0

bien cela a fixé les données n'étant pas envoyées au serveur. maintenant le code php a un problème ... essayez de supprimer ceci: echo json_encode ("Status: 200"); – djodjo

+1

Cela n'a pas fonctionné, mais je l'ai trouvé un peu plus bas dans la trace de la pile: 'Causée par: java.io.EOFException: \ n introuvable: taille = 91 contenu = 57000000ff6a04486f73742027616e64726f69642d3939363936623535643931 ... 04-06 17: 34: 28.457 12891-13068/ske.matej.project W/System.err: sur com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict (RealBufferedSource.java:200) 04-06 17: 34: 28.457 12891-13068/ske.matej.project W/System.err: sur com.android.okhttp.internal.http.HttpConnection.readResponse (HttpConnection.java:191) 04-06 17: 34: 28.457 12891-13068/ske.matej.project W/System.err: \t ... 16 plus' – MatejS

0

Je lutté beaucoup pour la solution de ce problème. J'ai recherché différents postes de S/O, j'ai résolu le problème en ajoutant l'en-tête "Connexion: fermer" dans les demandes. J'ai trouvé la solution here

Quelque chose comme cela résoudra le java.net.ProtocolException: fin inattendue du flux:

okHttpClient = new OkHttpClient.Builder() 
      .addNetworkInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request().newBuilder().addHeader("Connection", "close").build(); 
        return chain.proceed(request); 
       } 
      }) 
      .build();