Что нового

[Сеть, интернет] отправка файла по сети

sergioz

Знающий
Сообщения
39
Репутация
5
AutoIt: 3.3,14,2
Версия: 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
Файл: http://

История версий:
1 и единственная

Источник: autoit-script.ru
Автор(ы): sergioz
 
Верх