MxMSN

« Older   Newer »
  Share  
xdmisterx
CAT_IMG Posted on 12/12/2009, 13:43     +1   -1




Chat client-server con protocollo TCP e trasferimento di file:
SPOILER (click to view)
CODICE
;client
TCPStartup()
#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>

HotKeySet("+{ENTER}","_invio")

Global $title="MxMSN"

$ip=InputBox($title,"Inserisci l'ip:",@IPAddress1,"",50,50)
If $ip="" Then Exit
$porta=InputBox($title,"Inserisci la porta:","8893","",50,50)
If $porta="" Then Exit
$socket=TCPConnect($ip,$porta)
If $socket=-1 Then
       MsgBox(16,$title,"Impossibile collegarsi.",5)
       Exit
EndIf

GUICreate($title,400,270)
GUISetFont(9,"","","Comic Sans MS")
$edit=GUICtrlCreateEdit("",0,0,400,200,$ES_READONLY+$WS_VSCROLL)
$msg=GUICtrlCreateInput("",10,210,300,20)
$send=GUICtrlCreateButton("Invia",315,210,80,20)
$filesend=GUICtrlCreateButton("Invia file",10,240,190,20)
$trilla=GUICtrlCreateButton("Trilla",205,240,190,20)

GUISetState()

While 1
       ;ricezione
       $recv=TCPRecv($socket,2048)
       If StringLen($recv) Then
               ;uscita
               If StringInStr($recv,"xEXITx",1) Then
                       _GUICtrlEdit_AppendText($edit,"L'altra parte ha chiuso la chat."& @CRLF)
               EndIf
               ;ricezione testo
               If StringInStr($recv,"xMSGx",1) Then
                       $string=StringReplace($recv,"xMSGx","","",1)
                       _GUICtrlEdit_AppendText($edit,"Remoto -> "& $string & @CRLF)
               EndIf
               ;ricezione file
               If StringInStr($recv,"xFileSendx",1) Then
                       _GUICtrlEdit_AppendText($edit,"Ricezione file in corso..."& @CRLF)
                       $file_recv=StringReplace($recv,"xFileSendx","",1)
                       $file_recv_save=FileSaveDialog($title,@DesktopDir,"All(*.*)",16,$file_recv)
                       Sleep(50)
                       GUISetState(@SW_DISABLE)
                       TCPSend($socket,"xOKx")
                       $tcprecvfile=_TCPFileRecv($file_recv_save,$socket)
                       GUISetState(@SW_ENABLE)
                       If $tcprecvfile=0 Then
                               MsgBox(16,$title,"Invio non riuscito.",5)
                       Else
                               _GUICtrlEdit_AppendText($edit,"File ricevuto con successo."& @CRLF)
                       EndIf
               EndIf
               ;trillo
               If StringInStr($recv,"xTRILLAx",1) Then
                       WinFlash($title,"",3,1000)
               EndIf
       EndIf
       
       Switch GUIGetMsg()
       Case $gui_event_close        ;exit
               TCPSend($socket,"xEXITx")
               Exit
       Case $send        ;invia testo
               $msg1=GUICtrlRead($msg)
               If $msg1 <> "" Then
                       TCPSend($socket,"xMSGx"& $msg1)
                       GUICtrlSetData($msg,"")
                       _GUICtrlEdit_AppendText($edit,"Locale -> "& $msg1 & @CRLF)
               EndIf
       Case $filesend        ;invia file
               $local=FileOpenDialog($title,@DesktopDir,"All(*.*)")
               If $local <> "" Then
                       _GUICtrlEdit_AppendText($edit,"Invio file in corso..."& @CRLF)
                       $filesplit=StringSplit($local,"")
                       $splitted=$filesplit[UBound($filesplit)-1]
                       TCPSend($socket,"xFileSendx"& $splitted)
                       While 1
                               $filerecv=TCPRecv($socket,2048)
                               If StringLen($filerecv) Then
                                       If StringInStr($filerecv,"xOKx",1) Then
                                               GUISetState(@SW_DISABLE)
                                               Sleep(100)
                                               $tcpsendfile=_TCPFileSend($local,$socket)
                                               GUISetState(@SW_ENABLE)
                                               If $tcpsendfile=0 Then
                                                       MsgBox(16,$title,"Invio non riuscito.",5)
                                               Else
                                                       _GUICtrlEdit_AppendText($edit,"File inviato con successo."& @CRLF)
                                               EndIf
                                               ExitLoop
                                       EndIf
                               EndIf
                       WEnd
               EndIf
       Case $trilla        ;trilla
               TCPSend($socket,"xTRILLAx")
       EndSwitch
WEnd




;file send
Func _TCPFileSend($sFile,$_socket)
       Local $error=False
       $sFileOpen=FileOpen($sFile, 16 + 0)
       $sFileRead=FileRead($sFileOpen)
       FileClose($sFileOpen)
       $sFileSize=BinaryLen($sFileRead)
       $prog=True
       TCPSend($_socket,"xBufferOnx")
       If $sFileSize < 100000 Then
               $TCPSend=TCPSend($_socket,$sFileRead)
               $prog=False
       Else
               ProgressOn($title,"Invio file in corso...","0%")
               $buff=$sFileRead
               Do
                       $perc=Round((BinaryLen($buff)/$sFileSize)*100,0)
                       $percfin=100-$perc
                       $TCPSend=TCPSend($_socket,BinaryMid($buff,1,100000))
                       $buff=BinaryMid($buff,$TCPSend+1)
                       ProgressSet($percfin,$percfin &"%")
               Until BinaryLen($buff)=0
       EndIf
       Sleep(100)
       TCPSend($_socket,"xEndTransx")
       If $prog=True Then ProgressOff()
       If $error=True Then
               Return 0
       Else
               Return 1
       EndIf
EndFunc ;==> _TCPFileSend

;file recv
Func _TCPFileRecv($rFile,$_socket)
       Local $error=False
       Local $buff, $no_recv_count=0
       While 1
               $recv=TCPRecv($_socket,2024)
               If StringInStr($recv,"xBufferOnx",1) Then ExitLoop
       WEnd
       While 1
               $TCPRecv=TCPRecv($_socket,100000)
               If StringLen($TCPRecv) Then
                       If $TCPRecv <> "" Then
                               $str=BinaryToString($TCPRecv)
                               $buff &=$str
                               $no_recv_count=0
                       EndIf
                       If StringInStr($TCPRecv,"xEndTransx",1) Then
                               ExitLoop
                       EndIf
               EndIf
       WEnd
               
       If $buff="" Then
               $error=True
       Else
               $buff=StringToBinary($buff)
               $rFileOpen=FileOpen($rFile,16+2)
               If $rFileOpen=-1 Then
                       $error=True
               Else
                       $rFileWrite=FileWrite($rFileOpen,$buff)
                       If $rFileWrite=0 Then
                               $error=True
                       EndIf
                       FileClose($rFileOpen)
               EndIf
       EndIf
       If $error=True Then
               Return 0
       Else
               Return 1
       EndIf
EndFunc ;==> _TCPFileRecv

Func _invio()
       If WinActive($title) Then
               $msg1=GUICtrlRead($msg)
               If $msg1 <> "" Then
                       TCPSend($socket,"xMSGx"& $msg1)
                       GUICtrlSetData($msg,"")
                       _GUICtrlEdit_AppendText($edit,"Locale -> "& $msg1 & @CRLF)
               EndIf
       EndIf
EndFunc


Server:
SPOILER (click to view)
CODICE
;server
TCPStartup()
#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <Inet.au3>
#include <GuiEdit.au3>

HotKeySet("+{ENTER}","_invio")

Global $title="MxMSN", $internet=False

$ping=Ping("maya.ngi.it",3000)
If $ping <> 0 Then $internet=True

$conn=GUICreate($title,140,190)
GUICtrlCreateLabel("Indirizzi ip disponibili:",10,15)
$list=GUICtrlCreateList("",10,35,120,100)
GUICtrlCreateLabel("Porta =>",10,140)
$porta1=GUICtrlCreateInput("8893",55,137,75,20,BitOR(0x2000,0x0001))
$ascolto=GUICtrlCreateButton("Avvia",10,160,120,20)

If $internet=True Then
       GUICtrlSetData($list,_GetIP())
EndIf
If @IPAddress1 <> "0.0.0.0" Then
       GUICtrlSetData($list,@IPAddress1)
EndIf
If @IPAddress2 <> "0.0.0.0" Then
       GUICtrlSetData($list,@IPAddress2)
EndIf
If @IPAddress3 <> "0.0.0.0" Then
       GUICtrlSetData($list,@IPAddress3)
EndIf
If @IPAddress4 <> "0.0.0.0" Then
       GUICtrlSetData($list,@IPAddress4)
EndIf

GUISetState()

While 1
       Switch GUIGetMsg()
       Case $gui_event_close
               Exit
       Case $ascolto
               $ip=GUICtrlRead($list)
               $porta=GUICtrlRead($porta1)
               If $ip <> "" Then
                       If $porta <> "" Then
                               ExitLoop
                       EndIf
               EndIf
       EndSwitch
WEnd
GUIDelete($conn)

$listen=TCPListen($ip,$porta)
Do
       $socket=TCPAccept($listen)
Until $socket > -1

GUICreate($title,400,270)
GUISetFont(9,"","","Comic Sans MS")
$edit=GUICtrlCreateEdit("",0,0,400,200,$ES_READONLY+$WS_VSCROLL)
$msg=GUICtrlCreateInput("",10,210,300,20)
$send=GUICtrlCreateButton("Invia",315,210,80,20)
$filesend=GUICtrlCreateButton("Invia file",10,240,190,20)
$trilla=GUICtrlCreateButton("Trilla",205,240,190,20)

GUISetState()

While 1
       ;ricezione
       $recv=TCPRecv($socket,2048)
       If StringLen($recv) Then
               ;uscita
               If StringInStr($recv,"xEXITx",1) Then
                       _GUICtrlEdit_AppendText($edit,"L'altra parte ha chiuso la chat."& @CRLF)
               EndIf
               ;ricezione testo
               If StringInStr($recv,"xMSGx",1) Then
                       $string=StringReplace($recv,"xMSGx","","",1)
                       _GUICtrlEdit_AppendText($edit,"Remoto -> "& $string & @CRLF)
               EndIf
               ;ricezione file
               If StringInStr($recv,"xFileSendx",1) Then
                       _GUICtrlEdit_AppendText($edit,"Ricezione file in corso..."& @CRLF)
                       $file_recv=StringReplace($recv,"xFileSendx","",1)
                       $file_recv_save=FileSaveDialog($title,@DesktopDir,"All(*.*)",16,$file_recv)
                       Sleep(50)
                       GUISetState(@SW_DISABLE)
                       TCPSend($socket,"xOKx")
                       $tcprecvfile=_TCPFileRecv($file_recv_save,$socket)
                       GUISetState(@SW_ENABLE)
                       If $tcprecvfile=0 Then
                               MsgBox(16,$title,"Invio non riuscito.",5)
                       Else
                               _GUICtrlEdit_AppendText($edit,"File ricevuto con successo."& @CRLF)
                       EndIf
               EndIf
               ;trillo
               If StringInStr($recv,"xTRILLAx",1) Then
                       WinFlash($title,"",3,1000)
               EndIf
       EndIf
       
       Switch GUIGetMsg()
       Case $gui_event_close
               TCPSend($socket,"xEXITx")
               Exit
       Case $send
               $msg1=GUICtrlRead($msg)
               If $msg1 <> "" Then
                       TCPSend($socket,"xMSGx"& $msg1)
                       GUICtrlSetData($msg,"")
                       _GUICtrlEdit_AppendText($edit,"Locale -> "& $msg1 & @CRLF)
               EndIf
       Case $filesend
               $local=FileOpenDialog($title,@DesktopDir,"All(*.*)")
               If $local <> "" Then
                       _GUICtrlEdit_AppendText($edit,"Invio file in corso..."& @CRLF)
                       $filesplit=StringSplit($local,"")
                       $splitted=$filesplit[UBound($filesplit)-1]
                       TCPSend($socket,"xFileSendx"& $splitted)
                       While 1
                               $filerecv=TCPRecv($socket,2048)
                               If StringLen($filerecv) Then
                                       If StringInStr($filerecv,"xOKx",1) Then
                                               Sleep(100)
                                               GUISetState(@SW_DISABLE)
                                               $tcpsendfile=_TCPFileSend($local,$socket)
                                               GUISetState(@SW_ENABLE)
                                               If $tcpsendfile=0 Then
                                                       MsgBox(16,$title,"Invio non riuscito.",5)
                                               Else
                                                       _GUICtrlEdit_AppendText($edit,"File inviato con successo."& @CRLF)
                                               EndIf
                                               ExitLoop
                                       EndIf
                               EndIf
                       WEnd
               EndIf
       Case $trilla
               TCPSend($socket,"xTRILLAx")
       EndSwitch
WEnd





;file send
Func _TCPFileSend($sFile,$_socket)
       Local $error=False
       $sFileOpen=FileOpen($sFile, 16 + 0)
       $sFileRead=FileRead($sFileOpen)
       FileClose($sFileOpen)
       $sFileSize=BinaryLen($sFileRead)
       $prog=True
       TCPSend($_socket,"xBufferOnx")
       If $sFileSize < 100000 Then
               $TCPSend=TCPSend($_socket,$sFileRead)
               $prog=False
       Else
               ProgressOn($title,"Invio file in corso...","0%")
               $buff=$sFileRead
               Do
                       $perc=Round((BinaryLen($buff)/$sFileSize)*100,0)
                       $percfin=100-$perc
                       $TCPSend=TCPSend($_socket,BinaryMid($buff,1,100000))
                       $buff=BinaryMid($buff,$TCPSend+1)
                       ProgressSet($percfin,$percfin &"%")
               Until BinaryLen($buff)=0
       EndIf
       Sleep(100)
       TCPSend($_socket,"xEndTransx")
       If $prog=True Then ProgressOff()
       If $error=True Then
               Return 0
       Else
               Return 1
       EndIf
EndFunc ;==> _TCPFileSend

;file recv
Func _TCPFileRecv($rFile,$_socket)
       Local $error=False
       Local $buff, $no_recv_count=0
       While 1
               $recv=TCPRecv($_socket,2024)
               If StringInStr($recv,"xBufferOnx",1) Then ExitLoop
       WEnd
       While 1
               $TCPRecv=TCPRecv($_socket,100000)
               If StringLen($TCPRecv) Then
                       If $TCPRecv <> "" Then
                               $str=BinaryToString($TCPRecv)
                               $buff &=$str
                               $no_recv_count=0
                       EndIf
                       If StringInStr($TCPRecv,"xEndTransx",1) Then
                               ExitLoop
                       EndIf
               EndIf
       WEnd
               
       If $buff="" Then
               $error=True
       Else
               $buff=StringToBinary($buff)
               $rFileOpen=FileOpen($rFile,16+2)
               If $rFileOpen=-1 Then
                       $error=True
               Else
                       $rFileWrite=FileWrite($rFileOpen,$buff)
                       If $rFileWrite=0 Then
                               $error=True
                       EndIf
                       FileClose($rFileOpen)
               EndIf
       EndIf
       If $error=True Then
               Return 0
       Else
               Return 1
       EndIf
EndFunc ;==> _TCPFileRecv

Func _invio()
       If WinActive($title) Then
               $msg1=GUICtrlRead($msg)
               If $msg1 <> "" Then
                       TCPSend($socket,"xMSGx"& $msg1)
                       GUICtrlSetData($msg,"")
                       _GUICtrlEdit_AppendText($edit,"Locale -> "& $msg1 & @CRLF)
               EndIf
       EndIf
EndFunc


vi allego anche gli eseguibili e il file per il trillo(quello di msn xD) qui
funziona sia in rete locale che in internet(l'unica cosa potrebbe essere il router che vi da fastidio :))
adesso sto facendo una funzione per mandare file splittati(senṇ con file da 1gb va in overflow)
testato con pacchetti di winrar per vedere se arrivavano integri.
ciao :)
 
Top
0 replies since 12/12/2009, 13:43   138 views
  Share