2016-04-06 25 views
0

Geri gelmeye devam eden bir sorunla uğraşıyorum ve oldukça sinirlendim. Ben veritabanına JSONObjects göndererek, çevrimiçi buldum bir şablon php webservice üzerinden bağlanmaya çalışıyorum. "Istenmeyen bir akış sonu" olmak üzere sunucudan yanıt kodu almaya çalışırken IOException veya ProtocolException almaya devam ediyorum. Hata mesajı gerçekten şifreli ve hata, java veya PHP kodunda olduğu hakkında hiçbir fikrim yok.ProtokolünException: akışının beklenmedik sonu

Yığın izlemesi:

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 (Ben yorum içeren kusurlu hattı işaretli)

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

endeksi bir göz alabilir bu yüzden, kod yayınlanmıştır .php (Henüz kodda fazla değişiklik yapmadım, şimdilik sadece bir bağlantı kurmak istiyorum)

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

Gerçekten verebilir herhangi bir yardım için teşekkür ederiz. Özellikle de Android geliştirme ve PHP'de hala bir noob olduğum için.

cevap

0

değişiklik bu:

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

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

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

için:

 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

Ben bu işe yaramazsa korkuyorum. java.io.IOException: bağlantısında beklenmeyen akış sonu {192.168.1.146:3306, proxy = DIRECT @ hostAddress = 192.168.1.146 cipherSuite = none protocol = http/1.1} (dönüşüm sayısı = 0) 'tekrar aynı satırda – MatejS

+0

de bu, sunucuya gönderilmiyor verileri düzeltildi. şimdi php kodunda bir sorun var ... şunu kaldırmayı deneyin: echo json_encode ("Durum: 200"); – djodjo

+1

Bu işe yaramadı, ancak bunu yığın izinde biraz daha aşağıda buldum: 'Neden: java.io.EOFException: \ n bulunamadı: size = 91 content = 57000000ff6a04486f73742027616e64726f69642d3939363936623535643931 ... 04-06 17: 34: 28.457 12891-13068/ske.matej.project W/System.err: com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict (RealBufferedSource.java:200) 04126 17: 34: 28.457 12891-13068/ske.matej.project W/System.err: 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 tane daha – MatejS

0

Ben bu konunun çözümü için bir çok mücadele etti. Muhtelif S/O yazıları somunu arandı Sorunu, istekte "Bağlantı: kapat" başlığı ekleyerek çözdüm. dere beklenmedik sonu: Böyle here

şey java.net.ProtocolException çözecek çözüm buldu

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