Problema con Thread Java - Android

Creando un socket entre Android y Java he conseguido conectarlo. El problema es que puedo enviar un mensaje desde Android a Java, pero a la hora de hacerlo al contrario me da un problema de AndroidRuntime Fatal Exception: Thread - 71, he estado googleando pero no he conseguido encontrar nada consistente.

El caso es que cuando comento la parte de leer(), la aplicación no me da problemas y si no la comento me lanza la excepción. Quiero saber como puedo resolverlo.

Gracias de antemano.

Código Android:

package com.example.socketandroid;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
    private TextView tv1, tv2;
     private EditText et1, etip, etport;
     private Switch swch;
     private Button btn1, btn2;
     private Thread t;
     private Socket s;
     private boolean estado;
     private String ip;
     private int port;
     private DataInputStream dis;
     private DataOutputStream dos;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
        // Declaración de las variables.
         Tv1 = (TextView) findViewById(R.id.textView1);
         tv2 = (TextView) findViewById(R.id.textView2);
         et1 = (EditText) findViewById(R.id.editText1);
         etip = (EditText) findViewById(R.id.dir_ip);
         etport = (EditText) findViewById(R.id.dir_port);
         swch = (Switch) findViewById(R.id.switch1);
         btn1 = (Button) findViewById(R.id.btn1);
         btn2 = (Button) findViewById(R.id.btn2);
         //Declaración de las llamadas.
         Btn1.setOnClickListener(this);
         btn2.setOnClickListener(this);
         swch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
             @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                     estado = connect();
                     tv2.append("Conexión establecida\n");
                     etip.setEnabled(false);
                     etport.setEnabled(false);
                 }else{
                     estado = disconnect();
                    tv2.append("Desconexión\n");
                    etip.setEnabled(true);
                     etport.setEnabled(true);
                 }
                 estadoconexion(estado);
             }
         });;
     }
     public void estadoconexion(boolean estado){
         if(estado) tv1.setText("Conectado");
         else tv1.setText("Desconectado");
     }
     public boolean connect(){
         ip = etip.getText().toString();
         port = Integer.valueOf(etport.getText().toString());
         try{
             t = new Thread(new ClientThread());
             t.start();
             return true;
         }catch(Exception ex){
             tv1.setText("Error connect()");
             Log.e("Error connect()", "" +ex);
         }
         return false;
     }
     public boolean disconnect(){
         try{
             dos.close();
             dis.close();
             s.close();
             return false;
         }catch(Exception ex){
             tv1.setText("Error disconnect()");
             Log.e("Error disconnect()", "" +ex);
         }
         return true;
     }
     @Override
     public void onClick(View v) {
         switch(v.getId()){
         case R.id.btn1:
             if(estado){
                 String frase = et1.getText().toString();
                 try {
                     dos.writeUTF(frase);
                     tv2.append("Yo: " +frase +"\n");
                 } catch (IOException e) {
                     tv1.setText("Error enviar()");
                    e.printStackTrace();
                 }
             } else {
           tv2.append("Cliente desconectado\n");
         }
         case R.id.btn2:
             et1.setText("");
             break;
         }
     }
    class ClientThread implements Runnable {
         public void run(){
             try{
                 s = new Socket(ip, port);
                 dis = new DataInputStream(s.getInputStream());
                 tv1.append(" - DIS\n");
                 dos = new DataOutputStream(s.getOutputStream());
                 tv1.append(" - DOS\n");
                 this.leer(); 
             }catch(UnknownHostException ex){
                 tv1.setText("Error run()");
                 System.out.println(ex);
                 ex.printStackTrace();
             }catch(IOException ex){
                 tv1.setText("Error run()");
                 System.out.println(ex);
                 ex.printStackTrace();
             }
        }
         public void leer(){
            String frase;
             while(true){
                try{
                     frase = dis.readUTF();
                     if(frase =! Null){
                         tv2.append("Yo: " +frase +"\n");
                     }
                     Thread.sleep(100);
                 }catch(Exception ex){
                     tv1.setText("Error leer()");
                     System.out.println(ex);
                     ex.printStackTrace();
                  }
             }
         }
    } // fin de ClientThread
}  // fin de la clase 

Añade tu respuesta

Haz clic para o