[ANDROID/DÚVIDA] SINGLE THREAD para MULTI THREAD!

0 respostas
L

Boa tarde galera...

eu tenho esse servidor socket

package com.sevidor;

import java.io.DataInputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class Servidor {

	private static boolean executando = true;
	private static String mensagem;
	private static final int PORTA = 1234;

	public static void main(String[] args) {

		try {
			ServerSocket server = new ServerSocket(1234);
			InetAddress addr = InetAddress.getLocalHost();
			System.out.println("----------- SERVIDOR CONECTADO "
					+ addr.getHostAddress() + " PORTA " + PORTA
					+ " -----------");
			System.out.println("Esperando Conexões.");

			Socket socket = server.accept();

			System.out.println("Sevidor-> Conectou Ip "
					+ socket.getInetAddress().getHostAddress());
			DataInputStream in = new DataInputStream(socket.getInputStream());

			try {
				while (executando) {
					mensagem = in.readUTF();
					System.out.println("Servidor-> Recebeu Mensagem: "
							+ mensagem);
				}
				System.out.println("Servidor-> Finalizado.");

				in.close();
				socket.close();
				server.close();
			} catch (Exception e) {
				String mensagem1 = "O Usuário se desconectou!";
				System.err.println("Servidor-> Erro: " + mensagem1);
				executando = false;
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

e tenho o cliente no android...

ClienteAndroid.java
package com.clienteandroid;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class ClienteAndroid extends Activity implements OnClickListener {
	private Button btnConectar;
	private TextView lbIp;
	private EditText edIp;
	private EditText edPorta;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// Recupera componenentes da tela
		btnConectar = (Button) findViewById(R.id.btnConectar);
		btnConectar.setOnClickListener(this);

		edIp = (EditText) findViewById(R.id.edIp);
		edPorta = (EditText) findViewById(R.id.edPorta);

		lbIp = (TextView) findViewById(R.id.lbIp);
		lbIp.setText(getLocalIpAddress());
	}

	public void onClick(View view) {
		if (view == btnConectar) { // Clicou no botão Conectar

			try {
				// Tenta iniciar uma conexão com o Servidor de Socket
				ConnectionSocket connection = ConnectionSocket
						.createConnection(edIp.getText().toString(), edPorta
								.getText().toString());
				connection.connect();
				// Inicia tela para envio de mensagens
				startActivity(new Intent(this, MensagemAndroid.class));
			} catch (Exception e) {
				// Mostra erro na tela
				Toast.makeText(this,
						"Não foi possível conectar->" + e.getMessage(),
						Toast.LENGTH_LONG).show();
			}

		}

	}

	/**
	 * 
	 * Método para recuperar ip do aparelho
	 */
	public String getLocalIpAddress() {
		try {
			for (Enumeration<NetworkInterface> en = NetworkInterface
					.getNetworkInterfaces(); en.hasMoreElements();) {
				NetworkInterface intf = en.nextElement();
				for (Enumeration<InetAddress> enumIpAddr = intf
						.getInetAddresses(); enumIpAddr.hasMoreElements();) {
					InetAddress inetAddress = enumIpAddr.nextElement();
					if (!inetAddress.isLoopbackAddress()) {
						return inetAddress.getHostAddress().toString();
					}
				}
			}
		} catch (SocketException ex) {
		}
		return null;
	}
}

ConnectionSocket.java

package com.clienteandroid;

 
import java.io.DataOutputStream;
import java.net.Socket;

import android.os.Handler;
import android.os.Message;

/**
 * Classe para Conexão com Socket Servidor
 * 
 */
public class ConnectionSocket {

	private static ConnectionSocket connection;
	private int porta;
	private String host;
	private Socket socket;
	private Sender sender;
	public static final int CONNECTED = 1;
	public static final int ERROR = 2;
	public static final int SENDING_MESSAGE = 3;
	public static final int DISCONNECTED = 4;
	private Message msg;
	private DataOutputStream out;
	private Handler handler; // Handle para notificações na tela

	private ConnectionSocket(String host, String porta) {
		this.host = host;
		this.porta = Integer.parseInt(porta);
	}

	// Método que cria Objecto ConnectionSocket
	public static ConnectionSocket createConnection(String host, String porta) {
		connection = new ConnectionSocket(host, porta);
		return connection;
	}

	// Retorna conexão atual
	public static ConnectionSocket getCurentConnection() {
		return connection;
	}

	// Conecta com o Servidor
	public void connect() throws Exception {
		this.socket = new Socket(host, porta);
		out = new DataOutputStream(socket.getOutputStream());
	}

	// Inicia Thread para envio de mensagens
	public void startSender(Handler handler) {
		sender = new Sender(out, handler);
		new Thread(sender).start();
		this.handler = handler;
	}

	// Método set mensagem para envio
	public void senMessage(String mensagem) {
		sender.setMessage(mensagem);
	}

	// Método para desconectar do Servidor
	public void disconnect() throws Exception {
		sender.disconnect();
		socket.close();
		if (handler != null) {
			msg = new Message();
			msg.arg1 = ConnectionSocket.DISCONNECTED;
			handler.sendMessage(msg);
		}

	}
}
MensagemAndroid.java
package com.clienteandroid;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class MensagemAndroid extends Activity implements OnClickListener {
	private TextView lbStatus;
	private EditText edMensagem;
	private Button btnDesconectar;
	private Button btnEnviar;
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			// Verifica mensagem do Handler e mostra na tela
			synchronized (msg) {
				switch (msg.arg1) {
				case ConnectionSocket.CONNECTED:
					lbStatus.setText("Conectado");
					break;
				case ConnectionSocket.SENDING_MESSAGE:
					lbStatus.setText("Enviou Mensagem");
					edMensagem.setText("");
					break;
				case ConnectionSocket.ERROR:
					lbStatus.setText("Ocorreu um erro->" + msg.obj);
					break;
				case ConnectionSocket.DISCONNECTED:
					lbStatus.setText("Servidor->Desconectou");
					break;

				}
			}
		};

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.form_msg);

		lbStatus = (TextView) findViewById(R.id.lbStatus);
		edMensagem = (EditText) findViewById(R.id.edMensagem);

		btnEnviar = (Button) findViewById(R.id.btnEnviar);
		btnEnviar.setOnClickListener(this);
		btnDesconectar = (Button) findViewById(R.id.btnDesconectar);
		btnDesconectar.setOnClickListener(this);

		try {
			// Recupera Conexão atual
			ConnectionSocket.getCurentConnection().startSender(handler);
		} catch (Exception e) {

			Toast
					.makeText(
							this,
							"Não foi possível iniciar o Serviço para envio de Mensagens.",
							Toast.LENGTH_LONG).show();
			finish();
		}
	}

	public void onClick(View v) {
		// clicou no botão desconectar
		if (v == btnDesconectar) {
			try {
				ConnectionSocket.getCurentConnection().disconnect();
			} catch (Exception e) {
				e.printStackTrace();
			}
			// Clicou no botão enviar mensagem
		} else if (v == btnEnviar) {
			ConnectionSocket.getCurentConnection().senMessage(
					edMensagem.getText().toString());
		}
	}
}

Sender.java

package com.clienteandroid;


import java.io.DataOutputStream;
import java.io.IOException;
import android.os.Handler;
import android.os.Message;

/**
 * Classe resposável por enviar mensagens ao Servidor
 * 
 * 
 */
class Sender implements Runnable {

	private DataOutputStream out;
	private boolean running = true;
	private Handler handler;
	private Message msg;
	private String sendMessage;

	public Sender(DataOutputStream out, Handler handler) {
		this.out = out;
		this.handler = handler;
	}

	public void run() {
		while (running) {// Enquanto estiver executando

			try {
				if (sendMessage != null) { // Se existir uma mensagem para
											// enviar
					msg = new Message();
					msg.arg1 = ConnectionSocket.SENDING_MESSAGE;
					handler.sendMessage(msg); // Notifica Handler

					out.writeUTF(sendMessage); // Escreve mensagem
					out.flush();
					sendMessage = null; // Seta nulo na mensagem
				}

			} catch (IOException e) {
				e.printStackTrace();
				msg = new Message();
				msg.arg1 = ConnectionSocket.ERROR;
				msg.obj = e.getMessage();
				handler.sendMessage(msg);
				running = false;
			}

		}
		try {
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}



	public boolean isRunning() {
		return running;
	}

	public void setRunning(boolean running) {
		this.running = running;
	}

	public void stop() {
		running = false;
	}

	public void setMessage(String message) {
		this.sendMessage = message;

	}

	public void disconnect() throws Exception {
		msg = new Message();
		msg.arg1 = ConnectionSocket.DISCONNECTED;
		handler.sendMessage(msg); // Notifica Handler
		running = false;
		out.close();
	}

}

O QUE EU TENHO QUE FAZER PRA DEIXAR DE SINGLE THREAD PARA MULTI THREAD ????

Quem puder me ajudar, eu agradeço.

Criado 31 de agosto de 2012
Respostas 0
Participantes 1