Redes – Sabe o que são sockets de comunicação? (Parte III)
Aprenda a programar uma aplicação cliente para Android
Quem gosta de tecnologia, certamente já se questionou como determinados sistemas funcionam e comunicam. Hoje em dia, graças a adopção, como strandard, do protocolo IP, os dispositivos conseguem facilmente “comunicar” entre eles de uma forma totalmente transparente para o utilizador. Mas como é que uma aplicação cliente consegue, por exemplo, comunicar com uma aplicação servidor e vice-versa?
Depois de termos apresentado um artigo sobre sockets e como funcionam (ver aqui), e de termos implementado a aplicação servidor (ver aqui), hoje vamos aprender a programar para Android, uma aplicação cliente, usando sockets.
Actualmente existem algumas tecnologias que permitem a comunicação entre máquinas. Uma das tecnologias/mecanismos mais comuns para comunicação entre máquinas é os sockets.
Socket é um mecanismo de comunicação, usado normalmente para implementar um modelo cliente/servidor, que permite a troca de mensagens entre os processos de uma máquina/aplicação servidor e de uma máquina/aplicação cliente. Programar uma aplicação cliente não é difícil e podemos aproveitar muito do código partilhado (gentilmente) por muitos programadores. A aplicação cliente foi desenvolvida em Java+XML no Eclipse.
Para desenvolverem a aplicação para Android, devem criar no eclipse um novo projecto Android, dar-lhe por exemplo o nome Socket Client e inserir o seguinte código na classe SocketClient.java.
Código fonte da classe SocketClient.java
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.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class SocketClient extends Activity { EditText textOut; TextView textIn,ip,porto; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textOut = (EditText)findViewById(R.id.textout); ip = (EditText)findViewById(R.id.edtIP); porto = (EditText)findViewById(R.id.edtPorto); Button buttonSend = (Button)findViewById(R.id.send); textIn = (TextView)findViewById(R.id.textin); buttonSend.setOnClickListener(buttonSendOnClickListener); } Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Socket socket = null; DataOutputStream dataOutputStream = null; DataInputStream dataInputStream = null; try { socket = new Socket(ip.getText().toString(), Integer.parseInt(porto.getText().toString())); dataOutputStream = new DataOutputStream(socket.getOutputStream()); dataInputStream = new DataInputStream(socket.getInputStream()); dataOutputStream.writeUTF(textOut.getText().toString()); textIn.setText(dataInputStream.readUTF()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if (socket != null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (dataOutputStream != null){ try { dataOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (dataInputStream != null){ try { dataInputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}; } |
Para a produção do layout, devem colocar o seguinte código no ficheiro main.xml
Código fonte do ficheiro main.xml
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textin" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="IP Servidor" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/edtIP" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:text="192.168.1.66" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Porto" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/edtPorto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:text="8888" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mensagem" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/textout" android:layout_width="fill_parent" android:layout_height="92dp" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> <Button android:id="@+id/send" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="enviar" /> </LinearLayout> |
Importantíssimo: No ficheiro manifest.xml devem incluir a seguinte informação
<uses-permission android:name="android.permission.INTERNET"/> |
Depois de compilado o código, o resultado será algo deste género, onde o utilizador deverá no campo IP, o endereço IP do servidor e no campo Porto, o porto de comunicação com o servidor.
A partir de agora é só testar e verificar se a aplicação cliente comunica com a aplicação servidor. Caso tenham alguma duvida ou problema não hesitem em deixar os vossos comentários.
Os sockets são sem duvida uma forma simples de colocar duas, ou mais aplicações a comunicarem entre si. É bastante simples a sua implementação e este mecanismo está disponível para todas as linguagens de programação. Com este tutorial fechamos esta rubrica sobre sockets. Dicas e sugestões são bem vindas para próximas rubricas.
Este artigo tem mais de um ano
Hoje em dia, graças a adopção, como strandard, do protocolo IP,
será certamente standard?
Nunca programei para android, por isso isto é capaz de ser útil.
Btw, utilizas-te(ou existe?) alguma ferramenta para desenhar o layout do android ?
Obrigado pelo artigo 😉
A melhor forma de desenvolver o layout em Android é usando o Eclipse. Em cima, o código xml já “desenha” o layout conforme mostrado pelo emulador na figura 😉
Obrigado, vou pesquisar sobre o tema.
Existe o netbeans com nbdroid, que facilita o desenho.
Estou a iniciar programação para android e tentei por em pratica este projecto.
Verifique que no ficheiro main falta no final
dá também erro na classe SocketClient.java, nas linhas onde está “R.id. …” . provavelmente é necessário alterar o ficheiro a classe R.java, pelo que não consegui compilar.
Se for possível ajuda, agradeço.
A classe R é definida automaticamente, o erro é a ficheiro main.xml que está incompleto.
Também me dá um erro ao compilar. Se alguém souber como corrigir o problema que possa ajudar, agradecia.
Vivam,
Vamos então por partes para ver o que vos está a falhar.
Algumas indicações para nos situarmos:
– A vossa classe chama-se SocketClient.java?
– Qual o erro que vos aparece?
No artigo faltava parte do Ficheiro main.xml, agora já está completo, vou testar
Eu tinha completado assim e já compilava:
ok, não consigo submeter código no comentário.
Vou testar com a alteração efectuada no artigo.
aqui dá erro;
“public void onClick(View arg0) {”
comentei a linha anterior “//@Override”
Resultou!!
Mandei mensagem do PDA Android para o PC com a aplicação servidor do artigo anterior num pc. Como tenho ambos por wi-fi, foi só ver qual o ip do pc.
Obrigado pelos artigos.
Muito Obrigado, funcionou perfeitamente.
Esta aplicação funcionará com uma aplicação servidor em c#.net?