2016-04-06 90 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();