Bogos 0 #1 Postado 19 Novembro, 2006 [center:fc67e76399]Winsock</span>. Vou dar uma pincelada básica sobre o controle: -Para que você possa trabalhar com ele primeiro você terá de carrega-lo através do menu Project->Components. Selecionando o Controle Winsock -Agora vamos dar uma abordada sobre as propriedades do controle: - LocalPort = É a porta que seu computador usará. A porta poderá ter até 4 dígitos numéricos - RemotePort = É a porta que receberá os dados - RemoteHostIP = Retorna o endereço IP da máquina remota - LocalIP = Retorna o IP da máquina local - LocalHostName = Retorna o nome da máquina local - BytesReceived = Indica a quantidade de dados recebidos (em bytes) Certo agora temos noções das propriedades mais importantes e como adicionar o controle Winsock no projeto. Vamos começar a montar as aplicações, iniciando pela aplicação Servidor, a que RECEBERÁ os dados. Crie um novo projeto no VB e no formulário insira um Label, um controle Winsok. Layout Agora vamos definir algumas variáveis que seram usadas em todo o projeto (variáveis globais) e o código a ser colocado no evento Load do Form. Public caminho As StringDim var_temp As StringDim tamanho As LongPrivate Sub Form_Load() respondeEnd SubA seguir o código da rotina atende chamada no Form_Load.Para utiliza-lo abra a janela de códigos do projeto e no menu clique em Tools->Add Procedure. Em Name digite responde, em Type deixe Sub e em Scope deixe Private (somente este formulário poderá "acessar" a rotina). A Dê OK e na janela de código basta copiar o código abaixo: Private Sub responde()On Error GoTo errome.winsock1.Closeme.winsock1.LocalPort = "3232"me.winsock1.Listenlabel1.Caption = " Servidor ON na porta : 3232"Exit Suberro: label1.Caption = "Erro - " & Err.Description & "End SubNo código acima nós tratamos qualquer possibilidade de erro, em seguida fechamos qualquer tipo de conexão do Winsock para que ele fique livre para ser utilizado. Depois indicamos a porta para que ele "escute", no caso 3232, logo após colocamos o componente para "escutar" através do comando Listen. Agora copie o código abaixo no projeto (cuidado para não "ferir" os códigos já prontos) Private Sub winsock1.DataArrival(ByVal bytesTotal As Long)\'recebemos os dados enviados e efetuamos o reconhecimento dos mesmosDim dados_recebidos As String\'armazenos os dados na string (dados_recebidos)Me.winsock1.GetData dados_recebidos\'lembre-se que enviamos do cliente : "arquivo|" & Me.caminho_remoto & "|" & tamanho_arquivo\'vamos destrinchar os dados enviados para efetuar o reconhecimentoIf Mid(dados_recebidos, 1, 7) = "arquivo" Then \'se o padrão esta coincidindo como esperado continuamos dados_recebidos = Mid(dados_recebidos, 9, Len(dados_recebidos) - 7) For i = 1 To Len(dados_recebidos) If Mid(dados_recebidos, 1, 1) <> "|" Then \'concatemos o caminho até encontrar o caractere "|" Me.caminho = Me.caminho + Mid(dados_recebidos, 1, 1) ElseIf Mid(dados_recebidos, 1, 1) = "|" Then \' encontramos "|" , saimos do laço dados_recebidos = Mid(dados_recebidos, 2, Len(dados_recebidos) - 1) Exit For End If \'concatenamos a cadeia e excluindo o caractere armazenado dados_recebidos = Mid(dados_recebidos, 2, Len(dados_recebidos) - 1) Next \'o resto da cadeia é o tamanho do arquivo tamanho_arquivo = Val(dados_recebidos)\'INFORMAMOS OS VALORES AO CLIENTEMe.winsock1.SendData "msg_requisicao_aceita"\'\'a varivael \'arquivo_temporario\' guarda o conteudo do arquivoarquivo_temporario = ""Else \'se o tamanho do arquivo temporario é diferente do arquivo enviado If Len(arquivo_temporario) <> tamanho_arquivo Then arquivo_temporario = arquivo_temporario + dados_recebidos \'quando o tamanho coincide então o arquivo chegou completo If Len(arquivo_temporario) = tamanho_arquivo Then \'abrirmos um arquivo binário para escrever o conteúdo dos dados Open Me.caminho For Binary As #1 Put #1, 1, arquivo_temporario \'fechamos o arquivo Close #1 Me.caminho = "" \'informamos ao cliente que o arquivo chegou completo Me.winsock1.SendData "msg_arquivo_recebido" End IfEnd IfEnd SubAs devidas explicações foram colocadas ao meio do código em forma de comentário para que não dê problema ao compilar o projeto e para que você possa estudar o código dentro do VB mesmo. Temos o servidor pronto! Agora vamos criar nosso cliente, que irá enviar os arquivos. Crie um projeto e deixe-o conforme figura abaixo: Layout Cliente Agora mude a propriedade name do Winsock para ws_cliente, o label para lbl_estado_winsock o botão enviar para cmd_enviar, o botão conectar para cmd_conectar, o textbox do IP para txt_ip, o textbox de destino para txt_ruta e o textbox do arquivo à enviar para txtarqselecionado. Agora limpe toda a área de código desse formulário e copie o código a seguir: Public conteudo_arquivo As StringDim nome_arquivo As StringDim caminho_remoto As StringDim tamanho_arquivo As LongPrivate Sub cmd_conectar_click()On Error GoTo trataerro\'antes de conectar o winsock deve estar fechadoMe.ws_cliente.Close\'me conecto o PC usando o numero ip a porta definida abaixo o Servidor tem que estar rodando e escutando na porta definidaMe.ws_cliente.Connect Me.txt_ip, "65355"\'habilita o frame com a opçõesMe.Frame1.Enabled = TrueExit Subtrataerro: lbl_estado_winsock = lbl_estado_winsock & Err.Number & " - " & Err.DescriptionEnd SubNa rotina acima nós definimos as variáveis e também o código do evento Click do botão Conectar que usa do método Connect para efetuar a conexão com o IP e porta que informamos anteriormente. As rotinas mais importantes do projeto cliente são exibidas abaixo: - Enviar arquivo - código do evento Click do botão Enviar - Tratamento dos dados - código que trata os dados que vão do servidor para o cliente Private Sub cmd_enviar_Click() caminho_remoto = txt_ruta.Text + nome_arquivo \'enviamos os dados para pode mandar o arquivo corretamente informando o caminho e o nome Me.ws_cliente.SendData "arquivo|" & caminho_remoto & "|" & tamanho_arquivoEnd Sub Private Sub ws_cliente_DataArrival(ByVal bytesTotal As Long)\'cada vez que se recebe algo armazenamos na variavelDim dado_recebido As StringMe.ws_cliente.GetData dado_recebidoSelect Case dado_recebido Case Is = "msg_requisicao_aceita": \'se o servidor recebeu a requisição e a aceitou \'enviamos o conteudo do arquivo lido ws_cliente.SendData conteudo_arquivo Case Is = "msg_arquivo_recebido": \'se o envio foi completo enviamos uma mensagem de informação \'MsgBox ("Arquivo envíado corretamente"), vbInformation lbl_estado_winsock = lbl_estado_winsock & " - Arquivo Enviado" \'ws_cliente.CloseEnd SelectEnd SubAgora é só botar pra rodar, testar e ser feliz =) Espero que não tenham problemas com os códigos/explicação, mas qualquer dúvida só postar http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/wink.gif Cya, Bogos <span style=\'color:blue\'> Net Fox! Compartilhar este post Link para o post Compartilhar em outros sites
Boleta 1 #2 Postado 19 Novembro, 2006 Excelente Bogos! Código fonte muito bem feito! Parabéns! O Sistema de envio do conteúdo está ótimo! Ótimos conceitos de Winsock! Abraços, //Bol~ Compartilhar este post Link para o post Compartilhar em outros sites
Bogos 0 #3 Postado 20 Novembro, 2006 ^^ValeusDeu um bom trabalho mas acho que valeu a pena xDSempre que for possível eu vou criar mais tópicos como esse=DCya,Bogos Compartilhar este post Link para o post Compartilhar em outros sites
Zero 0 #4 Postado 20 Novembro, 2006 Muito legal, mas parece estar faltando segmentos do código.Não consegui visualizar a parte em que o arquivo é lido, e a variável conteudo_arquivo só é declarada e enviada vazia?Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Convidado Bush #5 Postado 20 Novembro, 2006 Pelo o que os outros estao falando parece ser muito bom =DMas espero nunca precisar fazer um lances desse.Pq nao entendi puffas.Sou iniciante ainda ¬¬"Mas vlw pelo Topico xD Compartilhar este post Link para o post Compartilhar em outros sites
flipagenor 0 #6 Postado 20 Novembro, 2006 iBogos, ta excelente, mas voce deveria falar para as pessoas colocarem tipo o código responde() em um módulo, fica mais fácil arrumar (mas o código esta muito bom).@~Zero:Também achei o evento eniar ta confuso, mas eu entendi um pouco, ele usou a tag para formar o caminho. É isso né iBogos? Compartilhar este post Link para o post Compartilhar em outros sites
Zero 0 #7 Postado 20 Novembro, 2006 Certo, mas só enviando o caminho não tem como o receptor obter o conteúdo do arquivo. A variável conteudo_arquivo é declarada e enviada pelo Winsock sem valor algum. Acredito que esteja faltando partes do código ou que ele esteja incompleto. Compartilhar este post Link para o post Compartilhar em outros sites
Bogos 0 #8 Postado 20 Novembro, 2006 realmente está mesmovou dar uma estudada e arrumar:Ssorry hehe Compartilhar este post Link para o post Compartilhar em outros sites
Zero 0 #9 Postado 20 Novembro, 2006 Nada, o que tem desenvolvido no tópico é de grande valia. Muitos usuários podem aprender bastante coisa aqui, mesmo enquanto incompleto!Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Bogos 0 #10 Postado 21 Novembro, 2006 @Zero seu alerta foi bem persepicáz, pois aquele textbox Destino não está servindo pra nada, porém se eu não me engano (não tenho + o projeto e eu ainda não coloquei esse pra compila :S) o servidor (receptor) irá colocar o arquivo na pasta atual do projeto. O código funciona, porém não como devia hehe Espero que tenho consegui passar algum conceito sobre Winsock de forma clara =) E valeu ae pelo toque, passou batido http://forum.otserv.com.br/style_emoticons/<#EMO_DIR#>/ohmy.gif Cya, Bogos Compartilhar este post Link para o post Compartilhar em outros sites
Zero 0 #11 Postado 21 Novembro, 2006 Com certeza conseguiu. Se tiver problemas com o código eu desenvolvo a parte que falta, porém acho que só poderei faze-lo no fim de semana, pois estou em semana de provas!Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Hypnotized 0 #12 Postado 1 Janeiro, 2007 Eu fiz tudo certinho aqui, porém não consigo conectar. Ele me retorna o erro 6 (Connecting) mas o certo seria 7 (Connected). Ps: Tem muito erro no script, eu fiz tudo certinho, mas deu erro. Mas eu tava vendo, dava pra ter a opção de procurar o arquivo, etc. Compartilhar este post Link para o post Compartilhar em outros sites
Convidado MarioToledo #13 Postado 3 Janeiro, 2007 Aew,boa, com esse projeto, eu posso fazer milicoisas agora ohohohohoho Compartilhar este post Link para o post Compartilhar em outros sites