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

L

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?

V

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:

V

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

L

você configurou o sysctl.conf?

V

Não!

Nem sabia que tinha que configurar isso.

:lol:

Att

L

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/
V

[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

L

huahauhauhauh é melhor a de 1 litro.

V

[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

L

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

V

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

L

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

V

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:

V

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.

V

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

V

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);
               
                }
            }
V

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