Что нового

Client.Server-Chat (Example) - программа для общения по интернету/локальной сети

firex

AutoIT Гуру
Сообщения
943
Репутация
208
AutoIt: 3.x
Версия: 0.0

Категория: Интернет, Сеть, Разное

Описание: Короткий пример осуществления передачи данных между клиентами.
Сделал очень давно, более не поддерживаю. Часть функционала не осуществлена в GUI.

Код/Пример:
Код:
#NoAutoIt3Execute
Opt("TrayMenuMode",1)
Opt('WinWaitDelay', 5)
#Include <Array.au3>
#Include <Crypt.au3>
#Include <String.au3>
#Include <GUIEdit.au3>
#Include <NotifyBox.au3>
#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <StaticConstants.au3>
OnAutoItExitRegister("cleanup")

; === StartCode
_GUI_Create()

Global $sSocks[1][4] = [[0]]
Global $sRecv = '', $sRead = ''
Global $sSocket = -1, $cSocket = -1, $nSocket = -1
Global $sParam[3] = ['port/max','1616',-1]

; === MainLoop
While 1
   $hMsg = GUIGetMsg()
   Switch $hMsg
	  Case $GUI_EVENT_CLOSE
		 If $sSocket <> -1 Then _
			_FxB_Server_Close()
		 Exit 1488

	  Case $hDummy, $hButton[1] ;Послать сообщение
		 If ControlGetFocus($hGUI) = 'Edit2' Or $hMsg = $hButton[1] Then
			$sRead = GUICtrlRead($hEdit[1])
			GUICtrlSetData($hEdit[1],'')
			If $sSocket <> -1 Then
			   _FxB_Server_Print('ADMIN', $sRead)
			   ContinueLoop
			EndIf
			_FxB_Client_Print($sRead)
		 EndIf

	  Case $hMenu[1] ;Создание сервера
		 _FxB_Server_Create()

	  Case $hMenu[2] ;Настройки сервера
		 _GUI_ServerSettings()

	  Case $hMenu[3] ;Отключение сервера
		 _FxB_Server_Close()

	  Case $hMenu[6] ;Настройки клиента
		 _GUI_ClientSettings()

	  Case $hMenu[7] ;Отключение клиента от сервера
		 _FxB_Client_Disconnect()

	  Case $hMenu[9] ;О чате
		 _FxB_ShowAbout()

	  Case $hButton[0] ;Подключиться к серверу
		 If $cSocket <> -1 Then
			_FxB_Client_Disconnect()
			ContinueLoop
		 EndIf
		 $sRead = GUICtrlRead($hEdit[0])
   		 _FxB_Client_Connect(StringSplit($sRead,":"))

	  Case Else
		 If $sSocket <> -1 Then
			$nSocket = TCPAccept($sSocket)
			If $nSocket <> -1 Then
			   Local $u = $sSocks[0][0]+1
			   ReDim $sSocks[$u+1][4]
			   $sSocks[0][0] += 1
			   $sSocks[$u][3] = 0
			   $sSocks[$u][2] = _SocketToIP($nSocket)
			   $sSocks[$u][1] = $nSocket
			   $sSocks[$u][0] = $sSocks[$u][2]
			   _FxB_Server_Print('SERVER', $sSocks[$u][2] & ' подключен!',$u)
			EndIf
			$nSocket = -1

			For $i = 1 To $sSocks[0][0] Step 1
			   $sRecv = TCPRecv($sSocks[$i][1], 16384)
			   If @Error Then _
				  _FxB_Server_RemoveClient($i)

			   If $sRecv <> '' Then _
				  _FxB_Server_Print($sSocks[$i][0], $sRecv, $i)
			Next
		 ElseIf $cSocket <> -1 Then
			$sRecv = TCPRecv($cSocket, 16384)
			If @Error Then _
			   _FxB_Error('',@Error,'r0')

			If $sRecv <> "" Then _
			   _FxB_LogPrint($sRecv)
		 EndIf
   EndSwitch
WEnd

; === ServerFunctions
Func _FxB_Server_Create($iPort = '', $iPass = '')
   TCPStartup()
   $sSocket = TCPListen(@IPAddress1,$sParam[1])
   If @Error Then _
	  Return _FxB_Error('',@Error,'s0')

   _FxB_LogPrint('Сервер успешно создан!')
   GUICtrlsSetState($GUI_ENABLE,$hMenu[3],$hButton[1], $hEdit[1])
   GUICtrlsSetState($GUI_DISABLE,$hMenu[1],$hEdit[0],$hButton[0], $hMenu[2])
   Return $sSocket
EndFunc

Func _FxB_Server_Close()
   _FxB_Error('')
   _FxB_LogPrint('Сервер успешно отключен!')
   GUICtrlsSetState($GUI_DISABLE,$hMenu[3],$hButton[1], $hEdit[1])
   GUICtrlsSetState($GUI_ENABLE,$hMenu[1],$hEdit[0],$hButton[0], $hMenu[2])
EndFunc

Func _FxB_Server_Print($iUser,$iMsg,$iSender=-1)
  If $iMsg = '' Then _
	  Return _NotifyBox( 16, "", "Некорректное сообщение!")

   Local $i, $fMsg = '|' & $iUser & '|: ' &  $iMsg
   _FxB_LogPrint($fMsg)
   For $i = 1 To $sSocks[0][0] Step 1
	  If $i <> $iSender Then _
		 TCPSend($sSocks[$i][1], $fMsg)
	  If @Error Then _
		 _FxB_Server_RemoveClient($i)
   Next
EndFunc

Func _FxB_Server_RemoveClient($index)
   Local $temp = $sSocks[$index][0]

   TCPCloseSocket($sSocks[$index][1])
   _ArrayDelete($sSocks,$index)
   $sSocks[0][0] -= 1

   _FxB_Server_Print('SERVER', 'Участник ' & $temp & ' удален!')
EndFunc

; === ClientFunctions
Func _FxB_Client_Connect($sServer)
   If UBound($sServer) <> 3 Then _
	  Return _FxB_Error(MsgBox( 16, "", "Некорректный адрес!"),-1,'b0')

   Local $szIP
   TCPStartup()
   $szIP = TCPNameToIP($sServer[1])
   If $szIP = "" Then _
	  Return _FxB_Error('',@Error,'c0')

   Ping($szIP)
   If @Error Then _
	  Return _FxB_Error('',-1,'p0')

   $cSocket = TCPConnect($szIP, $sServer[2])
   If @Error Then _
	  Return _FxB_Error('',@Error,'c1')

   _FxB_LogPrint('Соединение с ' & $szIP & ' установлено!')
   GUICtrlSetData($hButton[0],'Disconnect')
   GUICtrlsSetState($GUI_ENABLE,$hMenu[7],$hButton[1], $hEdit[1])
   GUICtrlsSetState($GUI_DISABLE,$hMenu[1],$hMenu[6], $hMenu[2])

   Return $cSocket
EndFunc

Func _FxB_Client_Disconnect()
   _FxB_Error('')
   _FxB_LogPrint('Вы отключились от сервера!')

   GUICtrlSetData($hButton[0],'Connect')
   GUICtrlsSetState($GUI_DISABLE,$hMenu[7],$hButton[1], $hEdit[1])
   GUICtrlsSetState($GUI_ENABLE,$hMenu[1],$hMenu[6], $hMenu[2])
EndFunc

Func _FxB_Client_Print($iMsg)
   If $iMsg = '' Then _
	  Return MsgBox( 16, "", "Некорректное сообщение!")

   _FxB_LogPrint('|YA <3|: ' & $iMsg)

   TCPSend($cSocket, $iMsg)
   If @Error Then _
	  Return _FxB_Error('',@Error,'s0')

   Return 1
EndFunc


; === GlobalFunctions
Func _FxB_LogPrint($iMsg)
   _GUICtrlEdit_AppendText($hEdit[2], $iMsg & @CRLF)
EndFunc

Func _FxB_Error($null, $wsa = -1, $api = -1)
   If $wsa <> -1 Then _
	  GUICtrlSetData($hLabel[0],"WSA.Err: " & $wsa)

   If $api <> -1 Then _
	  GUICtrlSetData($hLabel[1],"API.Err: " & $api)

   If $sSocket <> -1 Then
	  TCPCloseSocket($sSocket)
	  For $i = 1 To $sSocks[0][0] Step 1
		 TCPCloseSocket($sSocks[$i][1])
	  Next
   EndIf

   If $cSocket <> -1 Then _
	  TCPCloseSocket($cSocket)

   TCPShutdown()
   $sSocket = -1
   $cSocket = -1
   Dim $sSocks[1][4] = [[0]]
   Return -1
EndFunc

Func _FxB_ShowAbout()
   _NotifyBox( 64, 'FxB - About', 'Author: Firex' & @LF & _
			   '  Build: 2/2' & @LF & '  Version: 0.0/concept' & _
			   @LF & @LF & 'Development took an hour: 3')
EndFunc


; === GUI'sSection
Func _GUI_Create()
   Global $hGUI, $hDummy, $hMenu[11], $hEdit[3], $hButton[2], $hLabel[2]

   $hGUI = GUICreate("Chat FxB/lol - Server.Client v0.0", 386, 573, -1, -1, 0x94CA0000, 0x00000100)
   $hLabel[0] = GUICtrlCreateLabel("WSA.Err: 0", 276, 18, 110, 18, $SS_LEFT)
   $hLabel[1] = GUICtrlCreateLabel("API.Err: 0", 276, 34, 110, 18, $SS_LEFT)

   $hEdit[0] = GUICtrlCreateEdit('', 56, 21, 130, 18, $ES_LEFT)
   $hEdit[1] = GUICtrlCreateEdit('Сообщение...', 7, 493, 310, 50, 0x50200844 - 0x0800)
   $hEdit[2] = GUICtrlCreateEdit("Build nightly Apr 30 2012." & @CRLF, 7, 57, 372, 428, 0x50200844)

   $hButton[0] = GUICtrlCreateButton("Connect", 192, 20, 70, 20)
   $hButton[1] = GUICtrlCreateButton("Send", 320, 523, 60, 20)

   $hMenu[0] = GUICtrlCreateMenu("&Сервер")
   $hMenu[1] = GUICtrlCreateMenuItem("&Создать", $hMenu[0])
   $hMenu[2] = GUICtrlCreateMenuItem("&Настройки", $hMenu[0])
   GUICtrlCreateMenuItem("", $hMenu[0], 3)
   $hMenu[3] = GUICtrlCreateMenuItem("&Отключить", $hMenu[0])

   $hMenu[5] = GUICtrlCreateMenu("&Клиент")
   $hMenu[6] = GUICtrlCreateMenuItem("&Настройки", $hMenu[5])
   GUICtrlCreateMenuItem("", $hMenu[6], 2)
   $hMenu[7] = GUICtrlCreateMenuItem("&Отключиться", $hMenu[5])

   $hMenu[10] = GUICtrlCreateMenu("&About" & MBytes(' ', 75))
   $hMenu[9] = GUICtrlCreateMenuItem("&Chat FxB / lol version.",$hMenu[10])

   GUICtrlCreateLabel("Сервер:", 7, 22, 45, 18, $SS_RIGHT)
   GUICtrlCreateGroup("Подключение", 5, 5, 264, 46)
   GUICtrlCreateGroup("", 271, 5, 108, 46)
   GUICtrlSetFont($hLabel[0], 9, 400, 0, "Lucida Console")
   GUICtrlSetFont($hLabel[1], 9, 400, 0, "Lucida Console")

   $hDummy = GUICtrlCreateDummy()
   Global $aAccelKeys[1][2] = [["{ENTER}", $hDummy]]
   GUISetAccelerators($aAccelKeys)

   GUICtrlsSetState($GUI_DISABLE,$hMenu[3],$hMenu[7],$hButton[1], $hEdit[1])
   GUISetState(@SW_SHOW, $hGUI)
EndFunc

Func _GUI_ClientSettings()
   Local $GUIpos, $hGUIClientSettings, $hMsg

   $GUIpos = WinGetPos($hGUI, "")
   $hGUIClientSettings = GUICreate('Client Settings', 320, 135, $GUIpos[0] + 100, $GUIpos[1] + 100, -1, -1, $hGUI)
   GUISetState(@SW_DISABLE, $hGUI)
   GUISetState(@SW_SHOW, $hGUIClientSettings)

   While 1
	  $hMsg = GUIGetMsg()
	  Switch $hMsg
		 Case $GUI_EVENT_CLOSE
			ExitLoop

	  EndSwitch
   WEnd

   GUISetState(@SW_ENABLE, $hGUI)
   GUIDelete($hGUIClientSettings)
EndFunc

Func _GUI_ServerSettings()
   Local $GUIpos, $hGUIServerSettings, $hMsg

   $GUIpos = WinGetPos($hGUI, "")
   $hGUIServerSettings = GUICreate('Server Control', 320, 135, $GUIpos[0] + 100, $GUIpos[1] + 100, -1, -1, $hGUI)
   GUISetState(@SW_DISABLE, $hGUI)
   GUISetState(@SW_SHOW, $hGUIServerSettings)

   While 1
	  $hMsg = GUIGetMsg()
	  Switch $hMsg
		 Case $GUI_EVENT_CLOSE
			ExitLoop

	  EndSwitch
   WEnd

   GUISetState(@SW_ENABLE, $hGUI)
   GUIDelete($hGUIServerSettings)
EndFunc

; === ControlFunctions


; === InternalFunctions
Func MBytes($bytes, $count)
   Local $r, $i

   For $i = 1 To $count
	  $r &= $bytes
   Next
   Return $r
EndFunc

Func GUICtrlsSetState($state,$ctrl1,$ctrl2=0,$ctrl3=0,$ctrl4=0,$ctrl5=0)
   Local $array[5] = [$ctrl1,$ctrl2,$ctrl3,$ctrl4,$ctrl5]
   ReDim $array[@NumParams-1]

   For $i = 0 To @NumParams-2
	  GUICtrlSetState($array[$i],$state)
   Next
EndFunc

Func _SocketToIP($SHOCKET)
   Local $sockaddr, $aRet

   $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

   $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET,"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
   If Not @error And $aRet[0] = 0 Then
	  $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
	  If Not @error Then $aRet = $aRet[0]
   Else
	  $aRet = 0
   EndIf

   $sockaddr = 0
   Return $aRet
EndFunc

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