Sockets :o

21 respostas
S

Olá pessoal, ate ontem nem sabia o que era sockets olhei um tutorial aqui do Guj http://www.guj.com.br/articles/126, aprendi fiz uso em uma aplicação que desenvolvi, nessa aplicação fiz o contato do cliente ao servidores, porem não sei como faço o inverso :S
alguém poderia sugerir um lugar aonde fala sobre isso, ou postar umas linhas do código que faça isso pra me intender.

vlw ae Galera

21 Respostas

luciano2

O servidor não conecta ao cliente.

O ServerSocket fica escutando em uma porta quando um Socket(cliente) se conecta a ele, ele gera uma nova instancia de um Socket(cliente) e mantém a comunicação através dele.

Dessa forma o ServerSocket apenas aceita os clientes, mas a conversa fica como se o servidor fosse um cliente.

Me expressei bem?

S

Intão, no exemplo que segui ambos os tem sockets, ae ele conversa, mas como eu iria mandar uma msg do servidor para o cliente ou n teria como? ou eu teria q usar outro recurso de programação?

J

No server socket não existe um método read? Existe um write também.

S

No server socket não existe um método read? Existe um write também.

no exemplo que aprendi n usei nenhum metodo read do server socket

para o socket receber um informação ;p

usei entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));

como procederia com a saida?

ViniGodoy

O socket também tem um outputStream. Você pode usa-lo para comunicar de volta do servidor para o cliente.

S

tentei tentei e n consegui :frowning:

vcsmetallica

Galera!
Aproveitando o topico sobre socket, estou com a seguinte duvida, quantas conexoes o ServerSocket suporta?
Sei que depende do sistema operacional, minha aplicação vai rodar em Linux.
O meu codigo abaixo esta suportando somente + ou - 450 conexoes, passando disso da timeout do lado do cliente.

ExecutorService executor = Executors.newFixedThreadPool(5000);
ServerSocket serverSocket = new ServerSocket(751);
while (true) {
                Socket socket = serverSocket.accept();
                Logger.logInfo(">> Mais um equipamento atendido.");
                try {
                    ServidorSocket servidorSocket = new ServidorSocket(socket);
                    executor.execute(servidorSocket);
                } catch (Exception e) {
                    Logger.logError("Principal-main", e);
                } catch (Throwable t) {
                    Logger.logError("Principal-main", t);
                }
            }

Preciso conectar mais de 8000 equipamentos!!!
Oh sistema que esta dando dor de cabeça!!!

Att

luciano2

você configurou o sysctl.conf?

vcsmetallica

Não!

Nem sabia que tinha que configurar isso.

:lol:

Att

luciano2

O linux tem uma restrição sobre o número de processos abertos, uma vez tive um problema com isso.
Quando eu iniciava um processamento que fazia muitas conexões com outro hardware o jboss sofria um crash e escrevia um log informando “muitos arquivos abertos”
e dizia que o erro acontenceu fora da jvm.

A solução foi configurar este arquivo.

Eu encontrei está solução aqui.

http://www.thiagovespa.com.br/blog/2011/01/19/muitos-arquivos-abertos/
vcsmetallica

[quote=luciano@@]O linux tem uma restrição sobre o número de processos abertos, uma vez tive um problema com isso.
Quando eu iniciava um processamento que fazia muitas conexões com outro hardware o jboss sofria um crash e escrevia um log informando “muitos arquivos abertos”
e dizia que o erro acontenceu fora da jvm.

A solução foi configurar este arquivo.

Eu encontrei está solução aqui.

http://www.thiagovespa.com.br/blog/2011/01/19/muitos-arquivos-abertos/

Fio!!! Foi batata, estava aceitando exatos 960 conexoes. mudei e agora é correr para o abraço.

valeu pela força.

Outra coisa que ajudou foi as ampolas de 350ml, faz a gente pensar melhor!!!

Att

luciano2

huahauhauhauh é melhor a de 1 litro.

vcsmetallica

[quote=vcsmetallica]

luciano@@:
O linux tem uma restrição sobre o número de processos abertos, uma vez tive um problema com isso.
Quando eu iniciava um processamento que fazia muitas conexões com outro hardware o jboss sofria um crash e escrevia um log informando “muitos arquivos abertos”
e dizia que o erro acontenceu fora da jvm.

A solução foi configurar este arquivo.

Eu encontrei está solução aqui.

http://www.thiagovespa.com.br/blog/2011/01/19/muitos-arquivos-abertos/

Fio!!! Foi batata, estava aceitando exatos 960 conexoes. mudei e agora é correr para o abraço.

valeu pela força.

Outra coisa que ajudou foi as ampolas de 350ml, faz a gente pensar melhor!!!

Att

Entao, o efeito das apolas acabaram e veio a dor de cabeça!!!
Nao sei pq agora esta aceitando somente 4190 conexoes.
Mudei o arquivo solicitado para 20000
Do lado cliente esta retornado

java.net.ConnectException: Connection timed out: connect

Mas a aplicação do lado servidor não caiu e nem lancou nenhuma excessão.

Vou ter que beber mais ampolas!!!

Att

luciano2

Agora estou tão perdido quanto você. Vê se isso não é limitação da JVM, talvez precise configurar alguma coisa.

vcsmetallica

entao, coloquei a memoria com inicio de 512 e final de 1024.
Estou usando Debian, so que estou usando o debian em uma maquina virtual em cima do windows 2003. Nao sei se tem alguma coisa a ver.
Tenho uma maquina bem simples também com o debian, consegui mais de 14 mil conexoes, so nao fui alem pq o cooler estava ruim e fiquei com medo de queimar a maquina.

valeu

Att

luciano2

Cara tem que monitorar a memoria do seu debian pra ver se seu sistema está realmente utilizando toda esta memória.

ViniGodoy

Se você quiser suportar um número realmente agressivo de conexões, use as classes de conexão do pacote java.nio.
Através de Selectors, você conseguirá reduzir o número de threads do servidor, ao mesmo tempo reduzindo carga de processamento e footprint de memória.

Dê uma lida:

vcsmetallica

luciano@@:
Cara tem que monitorar a memoria do seu debian pra ver se seu sistema está realmente utilizando toda esta memória.

Ja estou fazendo isso.

vcsmetallica

ViniGodoy:
Se você quiser suportar um número realmente agressivo de conexões, use as classes de conexão do pacote java.nio.
Através de Selectors, você conseguirá reduzir o número de threads do servidor, ao mesmo tempo reduzindo carga de processamento e footprint de memória.

Dê uma lida:
http://tutorials.jenkov.com/java-nio/selectors.html

Oh “rapaiz” vou dar uma estudada nisso. vai que da certo na minha aplicação. Valeu

vcsmetallica

Galera,

Fiz as modificações que o ViniGodoy sugeriu.
So que esta dando o seguinte erro agora:

ERROR root  - Principal-mainjava.io.IOException: Too many open files
        at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:145)
        at br.com.ces.svias.principal.Principal.main(Principal.java:72)

Abaixo o meu codigo e vou destacar a linha 72

//Iniciando o servidor de sockets
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.socket().bind(new InetSocketAddress(new Integer(porta)));
            //ServerSocket serverSocket = new ServerSocket(new Integer(porta));
            SViasLogger.logInfo(">> Servidor aguardando conexão.");

            while (true) {
                try {
                    SocketChannel socketChannel = serverSocketChannel.accept();//LINHA 72 É ESSA AQUI
                    Socket socket = socketChannel.socket();
                    //Socket socket = serverSocket.accept();
                    SViasLogger.logInfo(">> Mais um equipamento atendido.");
                    ServidorSocket servidorSocket = new ServidorSocket(ponteEntreThread, socket);
                    executor.execute(servidorSocket);
                } catch (Exception e) {
                    SViasLogger.logError("Principal-main", e);
                   
                } catch (Throwable t) {
                    SViasLogger.logError("Principal-main", t);
               
                }
            }
vcsmetallica

Alem do erro acima, esta dando agora o seguinte erro tambem:

Connection reset by peer.

Anem viu!!!

Criado 18 de agosto de 2011
Ultima resposta 28 de ago. de 2011
Respostas 21
Participantes 5