Что нового

Как связать ListViewItem с определенным сокетом ?

VladUs

Скриптер
Сообщения
621
Репутация
180
Версия AutoIT:v3.3.6.1

Описание:

Имеется сервер и клиент. (Пример из офф. форума 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
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
VladUs
У Вас получился черновичек тех. задания в стол заказов.
Советую определиться, или просить о помощи "сделать все" или делать самому
и задавать вопросы по одному и мере поступления.

Как связать ListViewItem с определенным сокетом ?
А в каком именно смысле?
Если в ListView 10 строк. То после получения данных от ПК № 2, просто необходимо вставить
в строку ListView номер № 2 новые данные? Для этого удобно пользоваться функциями UDF:
_GUICtrlListView_SetItemText
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
180
А можно так?
Тему в "Стол заказов". А я тем временем буду пытаться сам разобраться, ну и соответственно будут возникать вопросы.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Можно. Пожалуйста, оформите тему в соответсвии правил. Тогда и перенесем.
 
Верх