Версия AutoIT:v3.3.6.1
Описание:
Имеется сервер и клиент. (Пример из офф. форума Autoit)
Сервер может обрабатывать большое кол-во клиентов.
Для примера, каждый клиент посылает любое число на сервер, а он в свою очередь, возвращает каждому клиенту
его же число но толоко умноженное на 10. Допустим клиент отправляет 10, а сервер в ответ 100.
Для сервера я сделал GUI в виде таблицы.
Необходимо, чтобы при нажатии кнопки "Send", число введеное в текстовое поле, отобразилось
в выделенной линии таблицы в столбце "Число" (Это реализовано). И это число должно уйти клиенту.
Клиент должен себя идентифицировать номером от 1 до 10 в соответствии с порядковым номером
из таблицы сервера. Грубо говоря. Запускается клиент и сообщает серверу, мол я клиент под номером 1 и буду с тобой обмениваться информацией через твою таблицу, моя линия в таблице первая.
Запускается клиент №2 и опять сообщает серверу мол я клиент под номером 2 и буду с тобой обмениваться информацией через твою таблицу, моя линия в таблице вторая.
И т. д.
Информация отображается (и уходящая и приходящая) в столбце "Число".
В столбце "Статус" должен отображаться статус подключения клиента. Если соединение есть, то отображается "Подключен", если соединение разорвано то пустая строка. Но это вопрос второстепенной важности.
Надеюсь на Вашу помощь.
Примечания:
Сервер:
Клиент:
Описание:
Имеется сервер и клиент. (Пример из офф. форума Autoit)
Сервер может обрабатывать большое кол-во клиентов.
Для примера, каждый клиент посылает любое число на сервер, а он в свою очередь, возвращает каждому клиенту
его же число но толоко умноженное на 10. Допустим клиент отправляет 10, а сервер в ответ 100.
Для сервера я сделал GUI в виде таблицы.
Необходимо, чтобы при нажатии кнопки "Send", число введеное в текстовое поле, отобразилось
в выделенной линии таблицы в столбце "Число" (Это реализовано). И это число должно уйти клиенту.
Клиент должен себя идентифицировать номером от 1 до 10 в соответствии с порядковым номером
из таблицы сервера. Грубо говоря. Запускается клиент и сообщает серверу, мол я клиент под номером 1 и буду с тобой обмениваться информацией через твою таблицу, моя линия в таблице первая.
Запускается клиент №2 и опять сообщает серверу мол я клиент под номером 2 и буду с тобой обмениваться информацией через твою таблицу, моя линия в таблице вторая.
И т. д.
Информация отображается (и уходящая и приходящая) в столбце "Число".
В столбце "Статус" должен отображаться статус подключения клиента. Если соединение есть, то отображается "Подключен", если соединение разорвано то пустая строка. Но это вопрос второстепенной важности.
Надеюсь на Вашу помощь.
Примечания:
Сервер:
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>
;Opt('MustDeclareVars', 1)
Global $listview, $msg, $SelectedLines, $input, $buttonSend, $text, $buttonExit
Global $MaxConnections=10 , $iCurrentSocket = 0, $oListenSocket, $oConnectedSocket[$MaxConnections]
_Gui()
_IPClient()
TCPStartup(); инициализируем запуск TCP
$oListenSocket = TCPListen(@IPAddress1, 16802, $MaxConnections)
If $oListenSocket = -1 Then
MsgBox(0, "Error", "Unable to start listening on port 16802")
Exit
EndIf
; Инициализируем массив сокетов
;Initialise the socket array with -1's
ConsoleWrite("Инициализация сервера: " & $MaxConnections & " сокетов инициализированно" & @crlf)
For $iCurrentSocket = 0 to $MaxConnections -1
$oConnectedSocket[$iCurrentSocket] = -1
Next
while 1
For $iCurrentSocket = 0 to $MaxConnections -1
If $oConnectedSocket[$iCurrentSocket] = -1 then
$oConnectedSocket[$iCurrentSocket] = TCPAccept($oListenSocket);Just cycle the sockets
If $oConnectedSocket[$iCurrentSocket] <> -1 then ConsoleWrite("Socket[" & $iCurrentSocket & "] Connected" & @crlf)
EndIf
Next
For $i = 0 To $MaxConnections -1
If $oConnectedSocket[$i] <> -1 Or $oConnectedSocket[$i] <> "" Then
$sResv = TCPRecv($oConnectedSocket[$i], 4096)
If $sResv <> "" Then
ConsoleWrite("Socket[" & $i& "]" & $sResv&@CRLF)
For $c = 0 to $MaxConnections -1 ; для примера, сервер возвращает каждому
If $oConnectedSocket[$c] <> -1 then TCPSend($oConnectedSocket[$i], "Socket[" & $c & "]: " & Number($sResv)*10) ; клиенту число, полученное от клиента и умноженное на 10
Next ; Но как связать определенную клетку в таблице с определенным сокетом
ElseIf @error Then
TCPCloseSocket($oConnectedSocket[$i])
If $oConnectedSocket[$i] <> -1 then ConsoleWrite("Socket[" & $i & "] Disconnected" & @crlf)
$oConnectedSocket[$i] = -1;Set the$oConnectedSocket[$i] socket back to -1 so it becomes available again
EndIf
EndIf
Next
Sleep(20)
$msg = GUIGetMsg()
Select
Case $msg = $buttonSend
_Send($input)
Case $msg = $buttonExit
exit
case $msg = $GUI_EVENT_CLOSE
exit
EndSelect
wend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GUI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Создаем интерфейс
Func _Gui()
GUICreate("", 400, 600)
$listview = GUICtrlCreateListView("№ |Статус | Число", 0, 0, 400, 400,BitOR($LVS_REPORT,$LVS_SINGLESEL), BitOR($LVS_EX_GRIDLINES , $LVS_EX_FULLROWSELECT))
$buttonSend = GUICtrlCreateButton("Send", 0,430, 100, 30)
$buttonExit = GUICtrlCreateButton("Exit", 300,430, 100, 30)
$input = GUICtrlCreateInput("", 150,430, 100, 30 )
$lab = GUICtrlCreateLabel("Число",150,410, 100, 20 )
GUISetState()
EndFunc
; Наполняем таблицу клиентами
Func _IPClient()
For $client = 1 to 10
;$avArray[$client]= GUICtrlCreateListViewItem($client & "||",$listview )
GUICtrlCreateListViewItem($client & "||",$listview )
Next
EndFunc
; Функция добавляет число в выделенную строку в клетку в столбце "Число"
Func _Send($Add)
$text=GUICtrlRead($input)
$SelectedLines =_GUICtrlListView_GetSelectedIndices($listview )
GUICtrlSetData ( $SelectedLines+8, "||" & $text)
EndFunc
Клиент:
Код:
#include <GUIConstants.au3>
Example()
Func Example()
Local $ConnectedSocket, $szData
Local $szIPADDRESS = @IPAddress1
Local $nPORT = 16802
$Gui = GUICreate("Client(Connected: " & $szIPADDRESS & " : " & $nPORT & ")", 315, 275, 419, 185)
$Group = GUICtrlCreateGroup(" Client ", 8, 8, 297, 257)
$Edit = GUICtrlCreateEdit("", 17, 56, 281, 201)
$Send = GUICtrlCreateButton("Send", 17, 24, 81, 25, 0)
$Input = GUICtrlCreateInput("", 110, 26, 185, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Sleep(2000)
TCPStartup()
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Else
TCPSend($ConnectedSocket, "")
Do
$recv = TCPRecv($ConnectedSocket, 4096)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Send
TCPSend($ConnectedSocket, GUICtrlRead($input))
EndSwitch
If $recv <> "" Then
GUICtrlSetData($edit,GUICtrlRead($edit) & $recv & @CRLF)
EndIf
If @error Then ExitLoop
Until $ConnectedSocket = -1
EndIf
EndFunc