Pessoal,
Tenho o seguinte código abaixo:
[code]import java.net.;
import java.io.;
public class ServidorTCPNumero {
public static void main(String[] args) {
int porta = 12259;
try {
ServerSocket servidor = new ServerSocket(porta,2);
Socket conexao = servidor.accept();
DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());
SocketAddress s = conexao.getRemoteSocketAddress();
System.out.println("Enviando um numero ao cliente: " + s.toString());
saida.writeInt(10);
saida.flush();
conexao.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
}[/code]
Esse programa acima roda como servidor e envia um número inteiro para o cliente quando esse faz uma conexão.
Só que eu queria fazer diferente, queria utilizar um Thread no servidor para capturar a conexão do cliente, ou seja ele iria ficar “dormindo” até um cliente conectar, depois ele executa suas funções etc.
Alguém tem idéia de como eu faço isso? Como eu faço para informar um Thread de outra aplicação? Ou existe um método que informe que uma conexão foi estabelecida e retorne true ou false e ai eu chamaria o Thread do servidor.
Estou com a dúvida pois estou aprendendo socketes e não sei como fazer.
Obrigado!
Não entendi muito sua pergunta.
Mas veja um pequeno exemplo de thread com classe interna anonima.
so q nesse caso, nao vejo vantagem, pq é como se a thread nao existisse, agora se vc qr multithread, vc implenta uma classe seguindo os principios de thread.
e ai deixa os data exemplo DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());
como atributos na classe que será sua thread.
De alguma forma qndo vocês instanciar sua thread, passa o servidor.accept().
o servidor.accept(). fiac esperando uma conexão, apos ela realizar vc passa por parametro entendeu? ai na suas Threads q serão sua logica recebe o socket e cria os DATA.
no exemplo que eu escrevi, vc tem q controlar o loop, pois se não fica infinito.
é so uma ideia isso que estou escrevendo.
A thread tem que extender a Thread, ou implentar Runnble, mas abaixo temos uma classe interna anonima, que é condenado. mas ela tem o metodo RUn, para vc startar.
[code]new Thread(){
public void run(){
while(true){
ServerSocket servidor;
try {
servidor = new ServerSocket(1111, 2);
Socket conexao = servidor.accept();
DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());
SocketAddress s = conexao.getRemoteSocketAddress();
System.out.println("Enviando um numero ao cliente: " + s.toString());
saida.writeInt(10);
saida.flush();
conexao.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();[/code]
Mas não faca isso.
Tente criar sua classe,
[code]
class bolinha extends Thread{
public atributos output, input etc.
public void run(){
sua logica
}
}
//aonde vc qr o loop antes do socket, no seu caso é na classe com main
static void main(string[] args)
Instancia_DA_sua_THREAD;
seu loop
INSTANCIA(servidor.accept())
INSTANCIA.START();
fim do seu loop[/code]
Repare que se sua Thread neste caso for iniciada, é pq houve um socket.
Falow, não esqueca de controlar o LOOP.
Não postei o codigo inteiro do segundo exemplo pq ta tarde, amanha eu vejo isso.
Mas me mande e-mail se qrer.
yoshikichi@gmail.com
Valeu pela força, te mandei um email.