Есть приложение сервера и приложение скрипта (примерно как в справке TCPSend & TCPTecv, но немного модифицированные)
Сервер
[hide]
[/hide]
Клиент
[hide]
[/hide]
Вопрос такой: как передать сообщение сервера клиенту, например ваши данные успешно получены.
И еще вопрос, как реализовать считывание данных сразу от всех клиентов в данном приложении при одновременной отправке принимаются сообщения отправленные только от 1-го подключившегося клиента.
Сервер
[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]
Код:
; Этот скрипт - клиент, запускайте его после сервера! (Запускайте сначала пример функции 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
Вопрос такой: как передать сообщение сервера клиенту, например ваши данные успешно получены.
И еще вопрос, как реализовать считывание данных сразу от всех клиентов в данном приложении при одновременной отправке принимаются сообщения отправленные только от 1-го подключившегося клиента.