Celular trava quando tento criar aplicação com socket

3 respostas
T
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:
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");}
	}	
}

E no android:

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

}

XML dele:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <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" />

</RelativeLayout>
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. :D
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)

3 Respostas

fabriciov

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.

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

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)

fabriciov

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.

Criado 28 de fevereiro de 2013
Ultima resposta 4 de mar. de 2013
Respostas 3
Participantes 2