Socket varias conexões

2 respostas
G

Olá pessoal!

Recebi uma tarefa aqui na empresa para desenvolver um sistema de comunição com o nosso departamento (TI) e pensei em utilizar socket com java pois o sistema interno da empresa é todo feito em Oracle Forms :lol: e ate consigo estabelecer uma conexão utilizando PL/SQL com o pacote UTL_TCP.
O problema esta em criar varias conexões do nosso departamento (serão clientes java com swing) com varias conexões do Forms (clientes dos departamentos) onde será persistido toda a conversa em um BD separado.
Então como faço para “pendurar” varios clientes em um host e mante-lo ativo depois que finalizar uma conexão?

Toda e qualquer ajuda/comentário e bem vindo, obrigado!

2 Respostas

ricardolecheta

algumas streams como a DataInputStream bloqueiam o readXXX se nao tiver nada para ler…

ou vc usa algo mais profi como :

http://xsocket.sourceforge.net/

ou

http://mina.apache.org/

G

Olá Ricardo!

Gostei muito desse xsocket, uma pena que não de para usar pois o host que irá prover o serviço usa java 1.3 e tanto esse quanto o mina requerem versões mais recentes do java.

Bom na luta de resolver e garimpando o google encontrei algumas coisas como esta abaixo que estou usando:

package fef;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

public class Server extends Thread {

    protected int port;
    protected ServerSocket server_port;
    protected ThreadGroup CurrentConnections;
    protected Vector connections;
    ServerWriter writer;

    public Server(int port) {
        super("Server Socket");
        this.port = port;

        try {
            server_port = new ServerSocket(this.port);
        } catch (IOException e) {
            System.out.println(e.getMessage());
            System.exit(0);
        }

        CurrentConnections = new ThreadGroup("Server Connections");
        System.out.println("Server configurado para receber conexoes na porta: " + this.port);
        System.out.println("### Conexoes Realizadas ###");

        connections = new Vector();

        writer = new ServerWriter(this);

        this.start();
    }

    public void run() {
        try {
            while (true) {

                String dataAtual = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date());

                Socket cliente_socket = server_port.accept();
                Connection c = new Connection(cliente_socket, CurrentConnections, 3, writer);

                System.out.println("IP:" + cliente_socket.getInetAddress() + " Porta:" + cliente_socket.getPort() + " - " + dataAtual);


                synchronized (connections) {
                    connections.addElement(c);
                }
            }
        } catch (IOException e) {
            System.out.println(e + "Exception");
        }
    }

    public static void main(String[] args) {
        if (args.length == 1) {
            try {
                new Server(Integer.parseInt(args[0]));
            } catch (NumberFormatException ex) {
                System.out.println("Digite somente numeros.");
            }
        }
    }
}

class Connection extends Thread {

    static int numberOfConnections = 0;
    protected Socket client;
    protected DataInputStream in;
    protected PrintStream out;
    protected ServerWriter writer;

    public Connection(Socket cliente_socket, ThreadGroup CurrentConnections, int priority, ServerWriter writer) {
        super(CurrentConnections, "Conexao #" + numberOfConnections++);

        this.setPriority(priority);
        client = cliente_socket;
        this.writer = writer;
        try {
            in = new DataInputStream(client.getInputStream());
            out = new PrintStream(client.getOutputStream());
            writer.OutputStreams.addElement(out);
        } catch (IOException e) {
            try {
                client.close();
                System.out.println("Exception while getting socket streams:" + e);
            } catch (IOException e2) {
                System.out.println("Exception while close socket client:" + e2);
                return;
            }
        }

        this.start();
    }

    public void run() {
        String inline;

        out.println("Conectado...");
        try {
            while (true) {
                inline = in.readLine();
                if (inline == null) {
                    break;
                }

                writer.setOutdata(inline);

                synchronized (writer) {
                    writer.notify();
                }
            }
        } catch (IOException e) {
        } finally {
            try {
                client.close();
                writer.setOutdata("Host:" + client.getInetAddress() + " Porta:" + client.getPort() + " desconectou.");

            } catch (IOException e2) {
            }
        }
    }
}

class ServerWriter extends Thread {

    protected Server server;
    public Vector OutputStreams;
    public String outdata;
    private String outputline;

    public ServerWriter(Server s) {
        super(s.CurrentConnections, "Server Writer");
        server = s;
        OutputStreams = new Vector();
        this.start();
    }

    public void setOutdata(String mensagem) {
        outdata = mensagem;
    }

    public synchronized void run() {
        while (true) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                System.out.println("Interrupted Exception " + e.getMessage());
            }
            outputline = outdata;
            synchronized (server.connections) {
                for (int i = 0; i < OutputStreams.size(); i++) {
                    PrintStream out;
                    out = (PrintStream) OutputStreams.elementAt(i);
                    out.println(outputline);
                }
            }
            System.out.println(server.writer.outputline + "\n\r");
        }
    }
}

falta agora fazer os clientes do nosso departamento "escutarem" todas as chamadas vinda de outros departamentos e integrar com o Forms...

Criado 27 de dezembro de 2007
Ultima resposta 28 de dez. de 2007
Respostas 2
Participantes 2