Что нового

Как передавать данные в две стороны (от клиента серверу и от сервера клиенту)

avtoIT

Новичок
Сообщения
94
Репутация
0
Есть приложение сервера и приложение скрипта (примерно как в справке TCPSend & TCPTecv, но немного модифицированные)
Сервер
[hide]
Код:
#include <GUIConstantsEx.au3>
; Этот скрипт - сервер, запускайте его первым! (Вторым запускайте второй пример из функции TCPConnect, который является клиентом).
TCPStartup() ; Запуск TCP служб.

; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
OnAutoItExitRegister("OnAutoItExit")

; Установка IP-адреса и порта
Local $sIPAddress = '127.0.0.1' ; Этот IP-адрес работает только для теста на вашем компьютере.
Local $iPort = 28932 ; Порт, используемый для соединения.

; Создает сокет связанный с указанным IP-адресом и портом с максимальным количеством подключений на ожидании 100.
Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)

If @error Then ; Если ошибка, то выход
	; Кто-то возможно уже прослушивает этот IP-адрес и порт (ещё одна копия скрипта уже выполняется?).
	MsgBox(4096 + 16, "Сервер", "Не удалось прослушать сокет, @error = " & @error)
	Return False
EndIf

$hGui = GUICreate("Сервер (" & $sIPAddress & ")", 300, 200, 100, 100)
$iEdit = GUICtrlCreateEdit("", 10, 10, 280, 180)
GUISetState()

While 1
	Example()
WEnd

Func Example()
    ; Переменная для клиентского сокета.
    Local $iSocket = 0
    Do ; Ожидание кого-то, кто подключится (Без ограничений).
        ; Принимает входящие соединения, если имеются (Сокет закрывается, при завершении; один сокет на одного клиента).
        $iSocket = TCPAccept($iListenSocket)

        If @error Then ; Если ошибка, то выход
            MsgBox(4096 + 16, "Сервер", "Не удалось принять входящее соединение, @error = " & @error)
            Return False
        EndIf
    Until $iSocket <> -1 ; Если не равно -1, это означает, что клиент подключен.
	$stringrecv = ''
	While $stringrecv = ''
		$stringrecv = BinaryToString (TCPRecv ($iSocket, 10000, 1))
	WEnd
	GUICtrlSetData($iEdit, _
                '$szIP_Accepted' & " > " & $stringrecv & @CRLF & GUICtrlRead($iEdit))
    ; Закрывает прослушиваемый сокет, чтобы позволить соединение в дальнейшем.
	TCPCloseSocket($iSocket) ; Закрывает сокет

    TCPCloseSocket($iListenSocket)

EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Останавливает TCP службу.
EndFunc   ;==>OnAutoItExit
[/hide]

Клиент
[hide]
Код:
; Этот скрипт - клиент, запускайте его после сервера! (Запускайте сначала пример функции TCPAccept).
Global $statusofcon = 0

HotKeySet ("!z", "_SendToServer")

While 1
	Sleep (250)
WEnd

Func _SendToServer()
    TCPStartup() ; Запуск TCP служб.

    ; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
    OnAutoItExitRegister("OnAutoItExit")

    ; Установка IP-адреса и порта
    Local $sIPAddress = '127.0.0.1' ; Этот IP-адрес работает только для теста на вашем компьютере.
    Local $iPort = 28932 ; Порт, используемый для соединения.

    ; Подключает прослушивание сокета, указанного IP-адреса и порта.
    Local $iSocket = TCPConnect($sIPAddress, $iPort)

	$stringtosend = StringToBinary (InputBox ("Что скажем серверу?", " "), 4)

	While 1
		If @error Then ; Если ошибка, то выход
			; Сервер, вероятно, в офлайне, или порт не открыт на сервере.
			$statusofcon += 1
		Else
			TCPSend ($iSocket, $stringtosend)
			ExitLoop
		EndIf
	WEnd

    TCPCloseSocket($iSocket) ; Закрывает сокет
	If $statusofcon > 5 Then
		MsgBox (0, '', 'Приносим свои извинения, но похоже, что наш сервер упал :(' & _
						'Пожалуйста, напишите на нашу почту, если проблема повторится еще раз', 0)
	EndIf
	$statusofcon = 0
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Останавливает TCP службу.
EndFunc   ;==>OnAutoItExit
[/hide]

Вопрос такой: как передать сообщение сервера клиенту, например ваши данные успешно получены.

И еще вопрос, как реализовать считывание данных сразу от всех клиентов в данном приложении при одновременной отправке принимаются сообщения отправленные только от 1-го подключившегося клиента.
 
Верх