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.
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
Shanar
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
juliocbq
No server socket não existe um método read? Existe um write também.
S
Shanar
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
ViniGodoy
O socket também tem um outputStream. Você pode usa-lo para comunicar de volta do servidor para o cliente.
S
Shanar
tentei tentei e n consegui
V
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.
ExecutorServiceexecutor=Executors.newFixedThreadPool(5000);ServerSocketserverSocket=newServerSocket(751);while(true){
Socketsocket=serverSocket.accept();Logger.logInfo(">> Mais um equipamento atendido.");try{
ServidorSocketservidorSocket=newServidorSocket(socket);executor.execute(servidorSocket);}catch(Exceptione){
Logger.logError("Principal-main",e);}catch(Throwablet){
Logger.logError("Principal-main",t);}
}
Preciso conectar mais de 8000 equipamentos!!!
Oh sistema que esta dando dor de cabeça!!!
Att
L
luciano2
você configurou o sysctl.conf?
V
vcsmetallica
Não!
Nem sabia que tinha que configurar isso.
:lol:
Att
L
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.
[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.
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
luciano2
huahauhauhauh é melhor a de 1 litro.
V
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.
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
Mas a aplicação do lado servidor não caiu e nem lancou nenhuma excessão.
Vou ter que beber mais ampolas!!!
Att
L
luciano2
Agora estou tão perdido quanto você. Vê se isso não é limitação da JVM, talvez precise configurar alguma coisa.
V
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
L
luciano2
Cara tem que monitorar a memoria do seu debian pra ver se seu sistema está realmente utilizando toda esta memória.
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:
V
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.
V
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.
//Iniciando o servidor de socketsServerSocketChannelserverSocketChannel=ServerSocketChannel.open();serverSocketChannel.socket().bind(newInetSocketAddress(newInteger(porta)));//ServerSocket serverSocket = new ServerSocket(new Integer(porta));SViasLogger.logInfo(">> Servidor aguardando conexão.");while(true){try{SocketChannelsocketChannel=serverSocketChannel.accept();//LINHA 72 É ESSA AQUISocketsocket=socketChannel.socket();//Socket socket = serverSocket.accept();SViasLogger.logInfo(">> Mais um equipamento atendido.");ServidorSocketservidorSocket=newServidorSocket(ponteEntreThread,socket);executor.execute(servidorSocket);}catch(Exceptione){SViasLogger.logError("Principal-main",e);}catch(Throwablet){SViasLogger.logError("Principal-main",t);}}
V
vcsmetallica
Alem do erro acima, esta dando agora o seguinte erro tambem: