Android Studio Java SSL Socket Client - PullRequest
       56

Android Studio Java SSL Socket Client

0 голосов
/ 12 сентября 2018

Я пытаюсь создать клиент для подключения к серверу. Но если я пытаюсь построить этот клиент в Android Studio, я становлюсь ФАТАЛЬНЫМ ИСКЛЮЧЕНИЕМ: android.os.NetworkOnMainThreadException. Я искал разные решения, но ничего не получалось. Я надеюсь, что вы можете мне помочь.

ИНТЕРНЕТ-РАЗРЕШЕНИЕ уже в Манифесте

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.oliverlenk.pmt, PID: 2387
              android.os.NetworkOnMainThreadException
                  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:333)
                  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
                  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
                  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
                  at java.net.Socket.connect(Socket.java:605)
                  at java.net.Socket.connect(Socket.java:554)
                  at java.net.Socket.<init>(Socket.java:431)
                  at java.net.Socket.<init>(Socket.java:210)
                  at com.example.oliverlenk.pmt.MainActivity$1.onClick(MainActivity.java:84)
                  at android.view.View.performClick(View.java:5637)
                  at android.view.View$PerformClick.run(View.java:22429)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Приложение прекращено.

Это мой код Java:

открытый класс MainActivity расширяет Activity {

// Inistailierung
Button Send;
EditText IP;
EditText Port;
TextView Answer;
EditText Message;

private String ip_address;
private int port = 11880;
private SSLSocket socket = null;
private BufferedReader in = null;
private BufferedWriter out = null;
private final String TAG = "TAG";
private char keystorepass[] = "key12345".toCharArray();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Send = (Button) findViewById(R.id.btnSend);
    IP = (EditText) findViewById(R.id.etIP);
    Port = (EditText) findViewById(R.id.etPort);
    Answer = (TextView) findViewById(R.id.tvAnswer);
    Message = (EditText) findViewById(R.id.etMessage);


    Send.setClickable(true);
    Send.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if (IP.getText().toString().equals(null) || Port.getText().toString().equals(null)){
                Toast.makeText(v.getContext(), "Bitte IP und Port eingeben", Toast.LENGTH_LONG).show();
            }else {
                String temp = Message.getText().toString();
                if (temp == null){
                    temp = "Es wurde keine Nachricht eingegeben";
                }
                port = Integer.parseInt(Port.getText().toString());
                ip_address = IP.getText().toString();

                try {
                    KeyStore ks = KeyStore.getInstance("BKS");
                    InputStream keyin = v.getResources().openRawResource(R.raw.neuserverkeypem);
                    ks.load(keyin,keystorepass);
                    org.apache.http.conn.ssl.SSLSocketFactory socketFactory = new org.apache.http.conn.ssl.SSLSocketFactory(ks);
                    socketFactory.setHostnameVerifier(socketFactory.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(temp);
                } 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();
        Answer.setText("SERVER SAID: "+line);
        //Log.i(TAG,line);
    } catch (IOException e1) {
        Log.i(TAG,"Read failed");
        System.exit(1);
    }
}

}

...