AutoIt: 3.3,14,2
Версия: 1.0
Категория: Сеть, Файловая система
Описание:
клиент-сервер отправка файла ч/з сеть
Код/Пример:
сервер:
клиент:
Файл: http://
История версий:
Источник: autoit-script.ru
Автор(ы): sergioz
Версия: 1.0
Категория: Сеть, Файловая система
Описание:
клиент-сервер отправка файла ч/з сеть
Код/Пример:
сервер:
Код:
opt("MustDeclareVars",1)
TCPStartup()
Global Const $Server_IP = "127.0.0.1"
Global Const $Server_PORT = "44444"
Global $MainSocket=TCPListen($Server_IP,$Server_PORT,100)
Global $ConnSocket=-1
while 1
Server()
Sleep(2000)
WEnd
Func Server()
Local $recv,$i,$file_size,$file_parts,$fname,$err
if $ConnSocket=-1 then;нет подключения
$ConnSocket=TCPAccept($MainSocket);подключаемся
Else;если есть подключение
$recv=TCPRecv($ConnSocket, 8040);читаем из сокета
$err=@error
if $err Then;разрыв соединения при ошибке чтения из сокета
TCPCloseSocket($ConnSocket)
$ConnSocket=-1
Else;обработка полученных данных
$recv=StringSplit($recv, @CRLF)
For $i=1 to $recv[0]
if $recv[$i]>"" Then _Srv_msg_proc($recv[$i])
Next
EndIf
EndIf
EndFunc
;~ =========================================================================================
Func _Srv_msg_proc($msg)
Local $i,$data,$file_parts,$fname,$curr_part=1
;~ ConsoleWrite("SrvProc:"&$msg&@CRLF)
if StringLeft($msg,1)="#" Then
$msg=StringSplit($msg, " ")
Switch $msg[1]
Case "#trans#";получено приглашение к началу отправки файла
$data=StringSplit($msg[2],"#")
$fname=StringSplit( $data[1],"\")
$fname=$fname[$fname[0]]
TCPSend($ConnSocket,"#ready#"&$fname&@CRLF);отправка готовности к получению файла
$file_parts=$data[2]
if FileExists(@ScriptDir&"\"&$fname) Then FileDelete(@ScriptDir&"\"&$fname);удаление старого файла
$fname=FileOpen(@ScriptDir&"\"&$fname,17);пересоздать !бинарный! файл
While 1
$data=TCPRecv($ConnSocket,8040)
;~ ConsoleWrite("SrvRec:"&$data& @CRLF)
if $data>"" then
if $curr_part>$file_parts Then;получена последняя часть - закрыть файл
FileClose($fname)
;~ ConsoleWrite("File closed!"& @CRLF)
ExitLoop
EndIf
$data=StringSplit($data,"#");отделение номера сообщения от данных
if $data[1]>"" and $curr_part=$data[1] Then
FileWrite($fname,BinaryToString(StringTrimRight($data[2],2)));удаляются из полученной строки @CRLF и конвертится в текст
TCPSend($ConnSocket,"#ok#"&$data[1]&@CRLF)
$curr_part+=1
Else;тут действия при потере пакета. пишем своё
ConsoleWrite("wrong part number!:"& $data[1] & @CRLF)
EndIf
EndIf
WEnd
EndSwitch
EndIf
EndFunc
Код:
opt("MustDeclareVars",1)
TCPStartup()
Global $Server_IP = "127.0.0.1"
Global Const $Server_PORT = "44444"
Global Const $read_count=4000;размер блока отправки/чтения
Global $ConnectedSocket=-1, $File,$rData, $fsize, $parts_num,$File_name,$err,$File_name_sh,$temp
while 1
Client()
Sleep(2000)
WEnd
Func Client()
Local $temp,$recv,$i,$j,$switch
if $ConnectedSocket = -1 then;нет подключения
$ConnectedSocket = TCPConnect($Server_IP, $Server_PORT);подключаемся
Else
;~ $File_name=@ScriptDir&"\"&@ScriptName
$File_name=FileOpenDialog("выберите файл для отправки","d:\","All (*.*)")
$temp=StringSplit($File_name,"\")
$File_name_sh=$temp[$temp[0]]
$File=FileOpen($File_name,16)
$fsize=FileGetSize($File_name)
$parts_num=Int($fsize/$read_count)+1
;~ ConsoleWrite("$parts_num:"&$parts_num&@CRLF)
TCPSend($ConnectedSocket,"#trans# "&$File_name&"#"&$parts_num&@CRLF);отправка данных о передаваемом файле
$err = @error
if $err Then;разрыв соединения при ошибке
ConsoleWrite ("ER " & $err& @CRLF)
TCPCloseSocket($ConnectedSocket)
$ConnectedSocket=-1
EndIf
$recv=TCPRecv($ConnectedSocket,8040)
$recv=StringSplit($recv,@CRLF)
For $i=1 to $recv[0];обработка полученной инфы
ConsoleWrite("clirec:"&$recv[$i]& @CRLF)
if $recv[$i]="#ready#" & $File_name_sh Then;клиент готов к приему файла
for $j=1 to $parts_num
$temp=FileRead($File,$read_count)
;~ ConsoleWrite("sending:"&$temp&@CRLF)
$temp=TCPSend($ConnectedSocket,$j&"#"& $temp &@CRLF)
;~ ConsoleWrite("send bytes:"&$temp&@CRLF)
;~ $err=@error
;~ ConsoleWrite("er:"&$err&@CRLF)
;~ ConsoleWrite("№ цикла:"&$j&@CRLF)
if $J=$parts_num then MsgBox(0,"","передача файла завершена")
While 1;ожидание получения подтверждения о доставке
$temp=TCPRecv($ConnectedSocket,8040)
;~ if $temp>"" then ConsoleWrite("clirec:"&$temp&@CRLF)
if $temp="#ok#"&$j&@CRLF Then ExitLoop;подтверждение получено, выход из цикла
WEnd
Next
EndIf
Next
EndIf
EndFunc
История версий:
1 и единственная
Источник: autoit-script.ru
Автор(ы): sergioz