FORUM DARKERS

Tecnologia & Informática => Programação => Java => Topic started by: OnlyOne on 22 de March , 2006, 12:24:45 PM

Title: MicroTutorial Sockets Java/Perl
Post by: OnlyOne on 22 de March , 2006, 12:24:45 PM
Bom moçada, em resposta ao meu amigo Shady resolvi escreve este pequeno texto q explica algumas

coisas em sockets , faz um certo tempo q eu aprendi perl , mas eu nao mexo mais com isso , pq

conheci o grande amor da minha vida , JAVA ne ? , hehehheehhehehehe , por isso os codigos perl

nao sao meus ok ? nao sei se os codigos tem erros , vcs olhem ai  e corrijam ok ?


Micro tutorial Sockets Java/Perl by OnlyOne

codigos perl por : BEHAEL


Let's go !!!


---- fazendo uma conexao ---------------------------------------------

em perl :


#!/usr/bin/perl -w

use Socket;

my $host = inet_aton('127.0.0.1');
my $destino = sockaddr_in (21, $host);
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die $!;
connect(SOCK, $destino) or die $!;
exit;


em java seria assim :

import java.net.*;

private Socket sock;
private InetAddress ia;

try{


ia = InetAddress.getByName("localhost");
 String ip = ia.getHostAddress();


sock = new Socket(ip,21);
 sock.close();

}catch(Exception a){ System.out.println("erro na conexao");
                      System.exit(0); }


a mesma coisa , fazendo conexao no local host na porta 21 e depois encerrando a conexao


***********************************************************************

---- Enviando dados na conexao ----------------------------------------


apos conectar , para enviar um dado vc faria assim


em perl :

#!/usr/bin/perl

use Socket;

my($HOST,$PORTA,$MSG);
print "Host: ";
chomp($HOST=);
print "Porta: ";
chomp($PORTA=);
print "Msg: ";
chomp($MSG=);
$line = "\n";
my $addr = inet_aton('$HOST');
my $destino = sockaddr_in($PORTA, $addr);
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect(SOCK, $destino) or die $!;
send(SOCK, $MSG, 0) or die $!;
send(SOCK, $line, 0) or die $!;
exit;


detalhe para a linha $PORTA=;

esse codigo esta lendo a linha de comando e armazenando na variavel $PORTA , STDIN e a entrada

padrao de terminal no linux , tb temos

STDOUT - saida padrao de terminal
STDERR - saida de erro padrao de terminal

este caracter <> faz leituras em perl


em java seria assim , mas so q agora eu vou usar a parte grafica da linguagem pq eu tenho

preguiça de fazer por linha de comando :)



import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.*;


private JTextField tf1;
private DataOutputStream dos;

tf1 = new JTextField("",20);


try{


ia = InetAddress.getByName("localhost");
 String ip = ia.getHostAddress();


sock = new Socket(ip,21);

dos = new DataOutputStream(sock.getOutputStream());
dos.writeUTF("USER OnlyOne");
dos.close();

sock.close();

}catch(Exception a){ System.out.println("erro");
                      System.exit(0); }

ao contrario do exemplo em perl onde o programa esta pedindo pra vc informar a porta , o host e a

frase q vc quer enviar , eu continuo me conectando no localhost na porta 21 e enviando a frase

"USER OnlyOne"

outro detalhe , em java esta nao e a unica forma de envio , eu posso manipular as streams de

entrada e saida de um socket de outras formas  :)


***********************************************************************

---- Recebendo dados na conexao --------------------------------------

ok , vc quer receber uma resposta na conexao , em perl eu nao tenho um exemplo pra dar , por isso

vou apenas passar a sintaxe da funçao ok ?


palavras do autor do texto original :


6) recv:

sintaxe: recv soquete, $var, comprimento, marcas

Recebe uma mensagem em um soquete. Tenta receber os bytes de comprimento
dos dados na variavel var a partir do handle de arquivo soquete
especificado. A funcao retornara o endereco do emissor ou um valor
indefinido se ouver um erro. A var aumentara ou diminuira segundo o
comprimento atualmente lido. A funcao tem as mesmas marcas da chamada
do sistema recv.

Ex: recv (SOQUETE, $buffer);



aproveitando vou por a sintaxe do send tb

palavras do autor do texto original :



7) send: sintaxe: send soquete, msg, marcas, [dest]

Envia uma mensagem msg em um soquete. Tem as mesmas marcas da chamada do
sistema com nome igual -- veja send(2). Nos soquetes desconectados, voce
tera que especificar um destino dest para enviar, neste caso send
funcionara como a sendto. A funcao retornara o numero de bytes enviados
ou um valor indefinido se houver um erro. No caso de erro, colocara o
codigo de erro em $!.

ex: $msg = "fuck";
    send(SOQUETE, $msg);



em java seria assim :

private DataInputStream dis;
private DataOutputStream dos;


try{


ia = InetAddress.getByName("localhost");
 String ip = ia.getHostAddress();


sock = new Socket(ip,21);

dos = new DataOutputStream(sock.getOutputStream());
dis = new DataInputStream(sock.getInputStream());

dos.writeUTF("USER OnlyOne");
String resposta = dis.readUTF(); //le a resposta
System.out.println(resposta);

dis.close();
dos.close();
sock.close();

}catch(Exception a){ System.out.println("erro");
                      System.exit(0); }


***********************************************************************

---- Analisando as respostas ------------------------------------------

ok , vc rescebeu uma resposta agora como analisa-la ?

eu nao lembro mais se perl tem uma funçao semelhante mas podemos fazer assim :


usando a funçao substr();


$var = substr("OnlyOne",0,2);

print $var;

o resultado seria a string "Onl"

sintaxe da funçao : substr(string,inicio do corte,fim do corte);

pegamos o inicio do corte , no caso o indice 0 -> letra O
pegamos o fim do corte , no caso o indice 2 -> letra l

certo ?

ai vc compara

exemplo

if($var equals "200"){

print "erro de conexao";
 exit(0);

}

em java agora :

String var = "200 - login incorreto";

if(var.startsWith("200")){
 System.out.println("erro de conexao");
  System.exit(0);

}



valeu ?

***********************************************************************
***********************************************************************
***********************************************************************


bom galera e isso , eu tentei passar de uma forma simples o conceito e espero ter ajudado as

pessoas q tem duvidas



                       Only
                       n
                       e

               The House Of The Rising Sun - otima musica !!!!!
Title: Re: MicroTutorial Sockets Java/Perl
Post by: Kratos on 22 de March , 2006, 12:48:15 PM
Otimo post kra .. tmb estou estudando socket ( em python)
Mas para que usar tanto espaço entre as linhas???

Bom..... execente explicaçao !!!

vlw!
Title: Re: MicroTutorial Sockets Java/Perl
Post by: Anonymous on 22 de March , 2006, 04:20:30 PM
manero... c tivesse como mostra como faz isso em cpp ia c perfeito .. vlw mesmo kra mto bom
Title: Re: MicroTutorial Sockets Java/Perl
Post by: Shady on 22 de March , 2006, 06:15:38 PM
Agradecido, OnlyOne. Com certeza vai me ajudar no caso das excessoes ;)

 Brigadao mano, eh noiz \o
Title: Re: MicroTutorial Sockets Java/Perl
Post by: OnlyOne on 22 de March , 2006, 06:20:25 PM
a claro, apesar de nao mexer mais com c++ a muito tempo eu vou postar aqui como q faz ta bao ?