Sockets/multi-client server

6 respostas
D
Bem, já que não obtive nenhuma resposta sobre o darkstar, resolvi utilizar meus conceitos básicos em sockets. Eu até consegui fazer um servidor com vários clientes, mais ele só trocava informação com um deles. Percebi que eu precisava armazenar os dados em algum lugar e pensei num arraylist. Ta dando um erro, eu preciso guardar um objeto nesse arraylist. A princípio estou fazendo com um arquivos só, ta ai:
/*
 * Main.java
 *
 * Created on 9 de Outubro de 2007, 9:29
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package servidor;

import java.net.*;
import java.io.*;
import java.util.ArrayList;
/**
 *
 * @author rafaelrocha
 */
public class Main {
    
    /**
     * @param args the command line arguments
     */
    ArrayList<Object> clientes = new ArrayList<Object>();
    public static void main(String args[]) {
        try {
            // cria um servidor na porta 18981
            ServerSocket servidor = new ServerSocket(18981);
            System.out.println("Porta 18981 aberta!");
                //aceita uma conexão
                client cli = new client();
                cli.acept(servidor.accept());
                clientes.add(cli);
                //tem que acessar o ultimo vlor do array
                //cli.acept(servidor.accept());
                
            
            
            //fecha tudo
            //in.close();
            //cliente.close();
            servidor.close();
                    
        } catch (IOException e){
            // em caso de erro
            System.out.println("Ocorreu um erro na conexão");
            e.printStackTrace();
        }
    }
}

class client{
    Socket cliente;
    public static void acept(Socket cliente){
       System.out.println("Nova conexão com o cliente" + cliente.getInetAddress().getHostAddress());
       

        // cria buffer de leitura
        BufferedReader in = new BufferedReader(
                new InputStreamReader(cliente.getInputStream())
        );
        
        
        //lê até o fim
        while(true){
            String linha = in.readLine();
            if(linha!=null){
                System.out.println("->" + linha +"<-");
            }
            if(linha=="Close"){
                break;
            }
        }
    }
    public void close(){
        cliente.close();
    }

    protected Object clone() throws CloneNotSupportedException {
    }
}

Se alguém poder me dar uma ajuda. Muito obrigado.

6 Respostas

T

Crie uma classe Conexao, com os seguintes membros:

Cliente cliente;
Socket socket;

Em vez de ArrayList use um ArrayList

D

Vou dar uma mexida no gódigo usando sua sugestão para ver se consigo… pelo que intendi… é pra mim colocar a abertura do servidor dentro da classe conexao… vo tentar

D

ArrayList<Conexao> clientes = new ArrayList<Conexao>(); public static void main(String args[]) { Conexao cli = new Conexao(); cli.socket(); clientes.add(cli);//aqui }

Ele da erro aonde eu comentei “aqui”, diz que não pode fazer esse método em contexto estático… vou tentar resolver, mais se alguém poder passar uma solução eu agradeço

P

Nem vi todo o código, mas, de cara, dá para ver que vc. não está usando um thread para cada cliente. Desta forma o máximo que vc. vai tratar de cada vez é um só mesmo. É isto que vc quer ?

Apenas uma observação: o tópico deste fórum é “Java Avançado”. Se vc. reconhece que seus conceitos de socket são “básicos”, pq não tenta postar no “Java Básico” ? Note: não estou dizendo que vc. não tenha o direito de postar o que bem entender em qualquer fórum (limitado, é claro, aos limites que os moderadores resolverem adotar).

Postando no tópico mais próximo do problema ajuda a ter respostas melhores…

D

psevestre:
Nem vi todo o código, mas, de cara, dá para ver que vc. não está usando um thread para cada cliente. Desta forma o máximo que vc. vai tratar de cada vez é um só mesmo. É isto que vc quer ?

Apenas uma observação: o tópico deste fórum é “Java Avançado”. Se vc. reconhece que seus conceitos de socket são “básicos”, pq não tenta postar no “Java Básico” ? Note: não estou dizendo que vc. não tenha o direito de postar o que bem entender em qualquer fórum (limitado, é claro, aos limites que os moderadores resolverem adotar).

Postando no tópico mais próximo do problema ajuda a ter respostas melhores…


Então, postei aqui por que eu imaginava que java basico seria para basico da programação… whiles, fros, variáveis essas coisas! Mais agora ja ta aqui meu post.
Já que você acha que devo usar um thread para cada cliente, por favor, me ensine como!

P

Uma boa regra para saber se a dúvida é básica ou não é ver se está coberta pelas APIs do JRE (Java Básico) ou outras (JEE) :^)

O pattern básico é o seguinte:

Thread Principal:

ServerSocket listenSocket = new ServerSocket(porta);

while (true){

Socket s = listenSocket.accept();

ClientHandler h = new ClientHandler(s);

Thread clientThread = new Thread(h);
clientThread.start();

}

A classe ClientHandler deve implementar a interface Runnable, e fica com esta cara:

class ClientHandler implements Runnable {

private Socket s;

public ClientHandler(Socket s) { this.s = s; }

public void run() {
InputStream in = s.getInputStream();

// lê dados, processa e manda resposta..

}

}

Criado 16 de abril de 2008
Ultima resposta 17 de abr. de 2008
Respostas 6
Participantes 3