Celular trava quando tento criar aplicação com socket

Seguinte povo, sou novo no android e estou aprendendo pro meu TCC do curso técnico e tudo mais, irei apresentar ele em dezembro, nele eu preciso criar conexão com um servidor, ja tentei um servidor PHP usando apache porém os códigos sempre bugavam em uma parte e eu nao achei solução, parti então pra ideia de um servidor java com sockets porém sempre que eu vou estabelecer uma conexão socket meu celular trava.
O código do servidor é o seguinte:

[code]import java.net.;
import java.io.
;

public class Start {
private final Integer porta = 9919;
ServerSocket sock;
DataInputStream in = null;
DataOutputStream out = null;

public static void main (String[] args){
	new Start().startServidor();
}

public void startServidor(){
	try{
		sock = new ServerSocket(porta);
		System.out.println("Servidor Online na porta "+porta);
		while (true){
			Socket clientSocket = sock.accept();
			System.out.println("Nova conexão de "+clientSocket.getInetAddress());
			in = new DataInputStream(clientSocket.getInputStream());
			out = new DataOutputStream(clientSocket.getOutputStream());
			String read = in.readUTF();
			out.writeBytes("Servidor: "+read);
			out.flush();
		}
	}catch (Exception ex){System.out.println("Desconectado");}
}	

}[/code]

E no android:

[code]package com.example.testesocket;

import java.net.;
import android.os.Bundle;
import android.app.Activity;
import android.view.
;
import android.widget.*;

public class MainActivity extends Activity {
private final String ip = “192.168.43.237”;
private final Integer porta = 9919;
Socket sock = null;
Button button;

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	button = (Button) findViewById(R.id.button1);
	button.setOnClickListener(new View.OnClickListener() {			
		@Override
		public void onClick(View v) {
			Toast toast;
			try{
				sock = new Socket (ip,porta);
				toast = Toast.makeText(getApplicationContext(), "Conectou", Toast.LENGTH_SHORT);
			} catch (Exception ex){toast = Toast.makeText(getApplicationContext(), "Conectou", Toast.LENGTH_SHORT);}
			toast.show();
		}
	});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	// Inflate the menu; this adds items to the action bar if it is present.
	getMenuInflater().inflate(R.menu.main, menu);
	return true;
}

}
[/code]

XML dele:

[code]

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/testar" />

[/code]

Já liberei tambem as permissões:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Se alguém me der uma luz, eu agradeço muito. :smiley:
ps.: ele trava quando clico no botão pra estabelecer a conexão
ps2.: o ip está correto.
ps3.: celular LG Optimus L5 (E612 se não me engano)

Não se faz ações bloqueantes na UI thread, pois dispara um ANR e a aplicação fecha.

O erro não consigo pensar em nenhum, mas se você usar o AsyncTask sua UI thread não vai travar e pode ser depois de um tempo seja disparada alguma exception para descobrir o problema.

[code]new AsyncTask<Params, Progress, Result>(){
@Override
protected Result doInBackground(Params… params) {
//esse metodo funciona em outra thread
return Result;
}

        @Override
        protected void onPostExecute(Result result) {
          //esse metodo executa na UI thrad
        }
    }.execute();    [/code]

Pode me dar um exemplo de como fazer isso com uma conexão socket? sou novo com tudo isso.
E se souber outro modo de criar conexão servidor/cliente e que possa me passar um tutorial, eu agradeço.

Edit1:
Conexão ocorre perfeitamente pela avd, só não pelo celular (WiFi)

Quando estava aprendendo android tinha feito um app desse, usei esse exemplo e funcionou perfeitamente - so gerava exception quando o celular não recebia resposta.

edit: esqueci de colocar os links


Sobre o async task; é igual uma thread, mas uma thread ‘inteligente’ - mais detalhes no android dev

//private class da activity
//se for colocar em outro arquivo, é preciso implementar um callback.
private class Task extends AsyncTask<String, Void, String> {
    ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);
    private String mIp;
    private int mPort;

    public Task(String ip, int port) {
        mIp = ip;
        mPort = port;
    }
    
      protected String doInBackground(String... params) {

        String value = null;
        Socket socket = null;
        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;

        try {
            socket = new Socket("192.168.1.101", 8888);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream.writeUTF(params[0]); // texto a enviar
            value = dataInputStream.readUTF(); // resposta
        } catch (UnknownHostException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (dataOutputStream != null) {
                try {
                    dataOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (dataInputStream != null) {
                try {
                    dataInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return value;
    }

    protected void onProgressUpdate(Void... progress) {

    }

    protected void onPostExecute(Long result) {
        if(mTextview !=null && result != null)
            mTextView.setText(result);
    }

Verifique:
Se a porta esta disponível.
Porta disponível no roteador.