2016-04-06 93 views
0

我一直在處理一個問題,不斷回來,我越來越沮喪。我試圖通過發送到JSONObjects的在線模板php webservice連接到我的數據庫。在嘗試從服務器獲取響應代碼時,我始終收到IOException或ProtocolException,原因是「流的意外結束」。錯誤信息真的很神祕,我不知道錯誤在於java或PHP代碼。我發佈的代碼,所以你可以看看:ProtocolException:意外流結束

堆棧跟蹤:

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(我標有註釋的那一行)

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; 
     } 
    } 
} 

指數.php(我在代碼中沒有太多變化,只是想現在建立連接)

<?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 ""; 
 
} 
 
} 
 
    
 
?>

我真的很感激任何幫助,您可以給。特別是因爲我仍然是Android開發人員和PHP的一名小白菜。

回答

0

改變這一點:

//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

恐怕行不通。 'java.io.IOException:在同一行上的Connection {192.168.1.146:3306,proxy = DIRECT @ hostAddress = 192.168.1.146 cipherSuite = none protocol = http/1.1}(recycle count = 0) – MatejS

+0

以及這固定的數據沒有被髮送到服務器。現在的PHP代碼有問題...嘗試刪除這個:echo json_encode(「Status:200」); – djodjo

+1

這沒有奏效,但是我發現它在堆棧跟蹤中有點進一步下降:'由於:java.io.EOFException:\ n未找到:size = 91 content = 57000000ff6a04486f73742027616e64726f69642d3939363936623535643931 ... 04-06 17: 34:28.457 12891-13068/ske.matej.project W/System.err:at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200) 04-06 17:34:28.457 12891-13068/ske.matej.project W/System.err:at 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 more' – MatejS

0

我掙扎了很多關於這個問題的解決方案。搜索各種S/O職位堅果我通過在請求中添加標題「連接:關閉」解決了問題。我找到了解決方案here

像這樣的事情會解決的java.net.ProtocolException:流意外結束:

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();