2016-04-11 19 views
0

Aşağıdaki istemciyi SSLSocketFactory kodunu kullanarak bir metin gönderip sonra sunucumda dinleyen bir .wav dosyası kullanıyorum, ancak bu kod bana iki hata veriyor.SSLSocketFactory derleme hataları

Bu iki satır bana hataları veriyoruz: Bu SSLSocketFactory soyut ve başlatılamaz söylüyor

SSLSocketFactory socketFactory = new SSLSocketFactory(ks); 

. Bunun için

socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

hata bu yöntemi setHostnameVerifier çözemezse ve sembol ALLOW_ALL_HOSTNAME_VERIFIER çözemezse olduğunu.

bir bütün olarak kod: ama bu hata çıktı yaşıyorum ben sabit

Button send; 
    EditText textSend; 
    private String ip_address = "192.168.10.103"; 
    private int port = 5000; 
    private SSLSocket socket = null; 
    private BufferedWriter out = null; 
    private BufferedReader in = null; 
    private final String TAG = "TAG"; 
    private char keystorepass[] = "....".toCharArray(); 
    private char keypassword[] = "....".toCharArray(); 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_send_screen); 
     send = (Button) findViewById(R.id.send); 
     textSend = (EditText) findViewById(R.id.textsend); 

     send.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String send = textSend.getText().toString(); 
       if(send.isEmpty()){ 
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(sendScreen.this); 
        dialogBuilder.setMessage("Enter Text!"); 
        dialogBuilder.setTitle("No TEXT"); 
        dialogBuilder.setPositiveButton("OK...", null); 
        dialogBuilder.show(); 
       }else{ 
        Log.i(TAG,"makes it to here"); 
        try{ 

         KeyStore ks = KeyStore.getInstance("BKS"); 
         InputStream keyin = v.getResources().openRawResource(R.raw.androidKey); 
         ks.load(keyin,keystorepass); 
         SSLSocketFactory socketFactory = new SSLSocketFactory(ks); 
         socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

         socket = (SSLSocket) 
           socketFactory.createSocket(new Socket(ip_address,port), ip_address, port, false); 
         socket.startHandshake(); 

         printServerCertificate(socket); 
         printSocketInfo(socket); 

         out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
         in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         chat(send); 
        } catch (UnknownHostException e) { 
         Toast.makeText(v.getContext(), "Unknown host", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"Unknown host"); 
         //System.exit(1); 
        } catch (IOException e) { 
         Toast.makeText(v.getContext(), "No I/O", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"No I/O"); 
         e.printStackTrace(); 
         //System.exit(1); 
        } catch (KeyStoreException e) { 
         Toast.makeText(v.getContext(), "Keystore ks error", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"Keystore ks error"); 
         //System.exit(-1); 
        } catch (NoSuchAlgorithmException e) { 
         Toast.makeText(v.getContext(), "No such algorithm for ks.load", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"No such algorithm for ks.load"); 
         e.printStackTrace(); 
         //System.exit(-1); 
        } catch (CertificateException e) { 
         Toast.makeText(v.getContext(), "certificate missing", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"certificate missing"); 
         e.printStackTrace(); 
         //System.exit(-1); 
        } catch (UnrecoverableKeyException e) { 
         Toast.makeText(v.getContext(), "UnrecoverableKeyException", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"unrecoverableKeyException"); 
         e.printStackTrace(); 
         //System.exit(-1); 
        } catch (KeyManagementException e) { 
         Toast.makeText(v.getContext(), "KeyManagementException", Toast.LENGTH_SHORT).show(); 
         Log.i(TAG,"key management exception"); 
         e.printStackTrace(); 
         //System.exit(-1); 
        } 
       } 
      } 
     }); 


    } 
    private void printServerCertificate(SSLSocket socket) { 
     try { 
      Certificate[] serverCerts = 
        socket.getSession().getPeerCertificates(); 
      for (int i = 0; i < serverCerts.length; i++) { 
       Certificate myCert = serverCerts[i]; 
       Log.i(TAG,"====Certificate:" + (i+1) + "===="); 
       Log.i(TAG,"-Public Key-\n" + myCert.getPublicKey()); 
       Log.i(TAG,"-Certificate Type-\n " + myCert.getType()); 

       System.out.println(); 
      } 
     } catch (SSLPeerUnverifiedException e) { 
      Log.i(TAG,"Could not verify peer"); 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 
    private void printSocketInfo(SSLSocket s) { 
     Log.i(TAG,"Socket class: "+s.getClass()); 
     Log.i(TAG," Remote address = " 
       +s.getInetAddress().toString()); 
     Log.i(TAG," Remote port = "+s.getPort()); 
     Log.i(TAG," Local socket address = " 
       +s.getLocalSocketAddress().toString()); 
     Log.i(TAG," Local address = " 
       +s.getLocalAddress().toString()); 
     Log.i(TAG," Local port = "+s.getLocalPort()); 
     Log.i(TAG," Need client authentication = " 
       +s.getNeedClientAuth()); 
     SSLSession ss = s.getSession(); 
     Log.i(TAG," Cipher suite = "+ss.getCipherSuite()); 
     Log.i(TAG," Protocol = "+ss.getProtocol()); 
    } 

    public void chat(String temp){ 
     String message = temp; 
     String line = ""; 
     // send id of the device to match with the image 
     try { 
      out.write(message+"\n"); 
      out.flush(); 
     } catch (IOException e2) { 
      Log.i(TAG,"Read failed"); 
      System.exit(1); 
     } 
     // receive a ready command from the server 
//  try { 
//   line = in.readLine(); 
//   mResponse.setText("SERVER SAID: "+line); 
//   //Log.i(TAG,line); 
//  } catch (IOException e1) { 
//   Log.i(TAG,"Read failed"); 
//   System.exit(1); 
//  } 
    } 

yukarıdaki iki sorun: böylece birini kullanmak zorunda

FATAL EXCEPTION: main 


Process: com.example.admirmonteiro.testclient, PID: 13735 


android.os.NetworkOnMainThreadException 
                         `at` `android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)` 
+0

Bu bir "gönderme sorunu" değil. Bunlar derleme hatalarıdır. Ayrıca [tag: ssl-certificate] ile ilgisi yoktur. – EJP

+0

'NetworkOnMainThreadException' kodunuzu AsyncTask içine koymanız veya' Voley ', 'OkHttp',' Retrofit' gibi bazı lib'leri kullanmanız gerekiyor ... – BNK

+0

Bunun nasıl yapılacağını bilmiyorum ... – Aboogie

cevap

0

SSLSocketFactory soyut onun çocuklar. Varsayılan uygulamayı almak için SSLSocketFactory.getDefault()'u kullanabilirsiniz.

setHostnameVerifier(), HttpsURLConnection değil SSLSocketFactory yöntemidir. Kodu bu bölümde kullanmalısınız.

Eğer HttpsURLConnection kullanmıyorsanız, sen ve böyle URL'yi doğrulamalıdır edebilirsiniz:

http://developer.android.com/training/articles/security-ssl.html

0

Sen':

// Open SSLSocket directly to gmail.com 
SocketFactory sf = SSLSocketFactory.getDefault(); 
SSLSocket socket = (SSLSocket) sf.createSocket("gmail.com", 443); 
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); 
SSLSession s = socket.getSession(); 

// Verify that the certicate hostname is for mail.google.com 
// This is due to lack of SNI support in the current SSLSocket. 
if (!hv.verify("mail.google.com", s)) { 
    throw new SSLHandshakeException("Expected mail.google.com, " 
            "found " + s.getPeerPrincipal()); 
} 

// At this point SSLSocket performed certificate verificaiton and 
// we have performed hostname verification, so it is safe to proceed. 

// ... use socket ... 
socket.close(); 

Android belgelerinde bazı gerçek dünya örnekleri görebilirsiniz ve sadece new SSLSocketFactory(KeyStore) yapıcıyı ve SSSLSocketFactory.setHostnameVerifier() yöntemini ya da yanlış SSLSocketFactory dosyasını içe aktarmışsınız.

+0

Yanlış mı yoksa doğru olanı mı ithal ettiniz? Bunu içe aktardım: import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; – Aboogie

+0

Tamam, bu ithalatı kullanmak yerine import org.apache.http.conn.ssl.SSLSocketFactory; ve hatalar gider, ancak bir metin göndermeye çalıştığımda, bu hatayı alıyorum: W/System.err: java.net.SocketException: soket başarısız oldu: EACCES (İzin reddedildi) – Aboogie

+0

Hangisini istediğinizi bilmiyorum ithal etmek. Bunu sadece sen cevaplayabilirsin. İçe aktardığınız, bu kurucuya veya bu yönteme sahip değil. – EJP

İlgili konular