Что нового

[Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я написа

3D_ARTIST

Новичок
Сообщения
9
Репутация
0
Не получается создать текстовой чат по локалке. Пробовал создать такой чтоб походил на "Radmin server - текстовой чат" (примерно). Ниже я накалякал код↓, но он меня не устраивает (edit - все время моргает), и нет архива сообщений (как минимум 10 сообщений)

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=beta
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

Global $input,$first,$fir

input()

GUICreate("Текстовой чат",300,380,-1,-1,0x00040000)
GUISetBkColor(0*0)

edit()
$button=GUICtrlCreateButton("Отправить",120,315)
$second=GUICtrlCreateEdit("",5,160,290,150,0x0004)
$exit1=GUICtrlCreateButton("Выход",200,315)
GUISetState () 

Func input()
	$input=IniRead("\\Artist\Папка общения\Файл общения.ini", "Текст общения", "user", "NotFound")
EndFunc

Func edit2()
	$second=GUICtrlCreateEdit($fir&@CRLF&"",5,160,290,150,0x0004)
EndFunc

Func edit()	
	$first=GUICtrlCreateEdit($input,5,5,290,150,$ES_READONLY)	
EndFunc
	
While 1
$msg = GUIGetMsg()
$sec=GUICtrlRead($second)
	GUICtrlDelete($first)
	call("edit")
	call("input")
	sleep(100)
	Select
		Case $msg=$button
			IniWrite("\\Artist\Папка общения\Файл общения.ini", "Текст общения", "user", $sec)
			GUICtrlDelete($second)
			call("edit2")
		Case $msg=$exit1
			Exit
	EndSelect
WEnd


Func reload()
	Call("input")
EndFunc


-- Я создал .INI файл и решил что так будет легче, открыл доступ с одной папкой (с разрешением на изменения файлов). Большая просьба помочь!!!
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 574
Репутация
335
Re: [Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я напи

http://autoit-script.ru/index.php/topic,2372.0.html
Не подходит?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Re: [Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я напи

Medic84 сказал(а):
http://autoit-script.ru/index.php/topic,2372.0.html
Не подходит?
Ну, может человек сам хочет создать, с нуля! ;)

3D_ARTIST [?]
Большая просьба помочь!!!
В данном контексте звучит, как напишите за меня! ;)
Чат написать не очень уж и сложно, все возможные варианты уже давно обкатаны! Вам остаётся лишь определится с выбором и почитать для начала справку по Autoit!
Ваша идея, на INI файлах ни есть хорошо!
Для начала разберите пример в английской справке (TCPRecv)
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 574
Репутация
335
Re: [Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я напи

Garrett [?]
Ну, может человек сам хочет создать, с нуля!
Ну, а если например посмотреть как там сделано?
 
Автор
3

3D_ARTIST

Новичок
Сообщения
9
Репутация
0
Re: [Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я напи

Garrett сказал(а):
Для начала разберите пример в английской справке (TCPRecv)

Я дико извиняюсь я в реале не понял как это работает :wacko:
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Re: [Сеть, интернет] Не могу создать текстовой чат(по локальной), примерный код(мой детский) я напи

вот когда-то баловался :D
Код:
Opt("TrayIconDebug", 1)
Opt("WinTitleMatchMode", 2)
Opt("TCPTimeout", 300)
Opt("GUICloseOnESC", 0)

#include <GUIRichEdit.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>

$proj = "Tet-a-Tet"

$hSW = GuiCreate("Tet-a-Tet", 200, 200)
GUISetIcon(@SystemDir & "\notepad.exe")

$tab = GUICtrlCreateTab(0, 0, 200, 200)

$tabMain = GUICtrlCreateTabItem("Main")

	$radioCl = GUICtrlCreateRadio("Client", 10, 30, 50)
	GUICtrlSetState($radioCl, $GUI_CHECKED)
	$radioSv = GUICtrlCreateRadio("Server", 70, 30, 50)

	$label_1 = GUICtrlCreateLabel("Enter your nickname:", 10, 55, 180, 17)
	$inputName = GuiCtrlCreateInput("user_" & Round(Random(999)), 10, 75, 180, 21)
	GUICtrlSetLimit($inputName, 24)

	$label_2 = GUICtrlCreateLabel("Enter server IP-address", 10, 105, 120, 17)
	$inputIp = GuiCtrlCreateInput("", 10, 125, 110, 21)
	GUICtrlSetLimit($inputIp, 15)

	$label_3 = GUICtrlCreateLabel("port", 150, 105, 40, 17)
	$inputPort = GuiCtrlCreateInput("8462", 130, 125, 60, 21)
	GUICtrlSetLimit($inputPort, 8)

	$buttConnect = GUICtrlCreateButton("Connect", 50, 160, 100, 30, $BS_DEFPUSHBUTTON + $BS_FLAT)

$ab = GUICtrlCreateTabItem("About")

GUICtrlCreateTabitem("")

$hCW = GUICreate("Tet-a-Tet - Client", 1000, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_SYSMENU))
GUISetIcon(@SystemDir & "\notepad.exe")
GUISetFont(15, 800, 0, "Courier New")

$inputStr = GUICtrlCreateInput("", 5, 570, 900, 27)
GUICtrlSetLimit($inputStr, 64)

$buttSend = GUICtrlCreateButton("Send", 910, 570, 85, 27, $BS_DEFPUSHBUTTON + $BS_FLAT)

$editOut = 0
$socket = -1

GUISetState(@SW_SHOW, $hSW)

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = -3
			TCPShutdown()
			Exit
		Case $msg = $radioSv
			GUICtrlSetState($label_2, $GUI_DISABLE)
			GUICtrlSetState($inputIp, $GUI_DISABLE)
			GUICtrlSetData($buttConnect, "Start")
			WinSetTitle("Tet-a-Tet - Client", "", "Tet-a-Tet - Server")
		Case $msg = $radioCl
			GUICtrlSetState($label_2, $GUI_ENABLE)
			GUICtrlSetState($inputIp, $GUI_ENABLE)
			GUICtrlSetData($buttConnect, "Connect")
			WinSetTitle("Tet-a-Tet - Server", "", "Tet-a-Tet - Client")
		Case $msg = $buttConnect And GUICtrlRead($radioSv) = 1			; старт сервера
			$sNick = GUICtrlRead($inputName)
			$sPort = GUICtrlRead($inputPort)
				If $sNick = "" Or $sPort = "" Then
					GUISetState(@SW_DISABLE, $hSW)
					MsgBox(0x40000, "Error", "Fill empty fields")
					GUISetState(@SW_ENABLE, $hSW)
				Else													; создание сокета
					_editOut_create()
					GUISetState(@SW_SHOW, $hCW)
					GUISetState(@SW_HIDE, $hSW)
					GUICtrlSetState($inputStr, $GUI_DISABLE)
					GUICtrlSetState($buttSend, $GUI_DISABLE)
					TCPStartup()
					_GUICtrlRichEdit_AppendText($editOut, "Starting server...")
					$count = 1
					Sleep(1000)
					$startSocket = TCPListen(@IPAddress1, $sPort)
					While $startSocket = -1								; повторное создание сокета
						$count += 1
						If $count = 11 Then								; после 10 неаудачных попыток - выход
							_GUICtrlRichEdit_AppendText($editOut, @CRLF & "All attempts not succesfuls" & @CRLF & "Quit...")
							Sleep(2500)
							_exit_CW()
							ExitLoop
						EndIf
						_GUICtrlRichEdit_AppendText($editOut, ".")
						Sleep(1000)
						TCPCloseSocket($startSocket)
						Sleep(500)
						$startSocket = TCPListen(@IPAddress1, $sPort)
						Sleep(500)
					WEnd
					If $startSocket <> -1 Then							; ожидание входящих подключений
						Opt("GUIOnEventMode", 1)
						_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Server succesfuly running!" & @CRLF & "Waiting incoming connections press [Ctrl-Z] for canceling... ")
						Sleep(1000)
						$abort = 0
						GUISetOnEvent("-3", "_exit_CW", $hCW)
						HotKeySet("^z", "_exit_CW")
							Do											; ожидание входящих подключений в цикле
								If $abort = 1 Then ExitLoop				; выход по команде пользователя
								_GUICtrlRichEdit_AppendText($editOut, ".")
								$socket = TCPAccept($startSocket)
								Sleep(1000)
							Until $socket <> -1
						HotKeySet("^z")
						If $abort = 0 Then								; клиент присоединился, получаем его Ник и IP-адрес
							Do
								If $abort = 1 Then ExitLoop						; выход по команде пользователя
								If $socket = -1 Then
									_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Connection lost")
									Sleep(2500)
									GUISetState(@SW_SHOW, $hSW)
									GUISetState(@SW_HIDE, $hCW)
									_GUICtrlRichEdit_Destroy($editOut)
									TCPShutdown()
									ExitLoop
								EndIf
								$sClNick_IP = TCPRecv($socket, 54)
								Sleep(100)
							Until StringLen($sClNick_IP) >= 1
							$aClNick_IP = StringSplit($sClNick_IP, "###[email protected]@@", 1)
							$sNick2 = $aClNick_IP[1]
							$sIP2 = $aClNick_IP[2]
							If $sNick2 = $sNick Then $sNick2 = $sNick2 & "_1" ; если ники сервера и клиента совпадают - переименовываем клиентский
							If $sNick2 <> "" Then				; при получении ника соединение оборвалось
								_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Client [" & $sNick2 & "] connected from IP [" & $sIP2 & "]")
								TCPSend($socket, $sNick)					; передаем свой ник
								GUICtrlSetState($inputStr, $GUI_ENABLE)
								GUICtrlSetState($buttSend, $GUI_ENABLE)
								Opt("GUIOnEventMode", 1)
								GUISetOnEvent("-3", "_exit_CW", $hCW)
								GUICtrlSetOnEvent($buttSend, "_send_message")
								While $socket <> -1						; пока есть соединение - отправляем/принимаем сообщения
									If $abort = 1 Then	ExitLoop		; выход по команде пользователя
									Sleep(25)
									$sIn = TCPRecv($socket, 64)
									If StringLen($sIn) >=1 And $sIn = "###[email protected]@@" Then ; получена команда завершения соедининия от клиента
										_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Connection closed by " & $sNick2)
										Sleep(2500)
										GUISetState(@SW_SHOW, $hSW)
										GUISetState(@SW_HIDE, $hCW)
										_GUICtrlRichEdit_Destroy($editOut)
										TCPShutdown()
										ExitLoop
									ElseIf StringLen($sIn) <> 0	Then	; отображение сообщения клиента
										_GUICtrlRichEdit_AppendText($editOut, @CRLF & $sNick2 & " << " & $sIn)
									EndIf
								WEnd
							EndIf
						EndIf
						Opt("GUIOnEventMode", 0)
					EndIf
				EndIf
		Case $msg = $buttConnect And GUICtrlRead($radioCl) = 1			; запуск клиента
			$sNick = GUICtrlRead($inputName)
			$ip = GUICtrlRead($inputIp)
			$sPort = GUICtrlRead($inputPort)
			If $ip = "" Or $sNick = "" Or $sPort = "" Then
				GUISetState(@SW_DISABLE, $hSW)
				MsgBox(0x40000, "Error", "Fill empty fields")
				GUISetState(@SW_ENABLE, $hSW)
			ElseIf _IsIP($ip) <> 1 Then									; проверка синтаксиса строки адреса сервера
				GUISetState(@SW_DISABLE, $hSW)
				MsgBox(0x40000, "Syntax Error", "IP-Address incorrect")
				GUISetState(@SW_ENABLE, $hSW)
			Else														; соединение с сервером
				Opt("GUIOnEventMode", 1)
				_editOut_create()
				GUISetState(@SW_SHOW, $hCW)
				GUISetState(@SW_HIDE, $hSW)
				GUICtrlSetState($inputStr, $GUI_DISABLE)
				GUICtrlSetState($buttSend, $GUI_DISABLE)
				TCPStartup()
				_GUICtrlRichEdit_AppendText($editOut, "Connecting to server [" & $ip & "] press [Ctrl-Z] for canceling... ")
				Sleep(1000)
				$abort = 0
				GUISetOnEvent("-3", "_exit_CW", $hCW)
				HotKeySet("^z", "_exit_CW")
					Do													; попытки соединения с сервером в цикле
						If $abort = 1 Then ExitLoop						; выход по команде пользователя
						_GUICtrlRichEdit_AppendText($editOut, ".")
						$socket = TCPConnect($ip, $sPort)
						Sleep(1000)
					Until $socket <> -1
				HotKeySet("^z")
				If $abort = 0 Then										; после соединения передаем ник клиента и его IP-адрес на сервер, с использованием разделителя (=
					TCPSend($socket, $sNick & "###[email protected]@@" & @IPAddress1)
					Do													; ждем получения ника сервера
						If $abort = 1 Then	ExitLoop					; выход по команде пользователя
						If $socket = -1 Then
							_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Connection lost")
							Sleep(2500)
							GUISetState(@SW_SHOW, $hSW)
							GUISetState(@SW_HIDE, $hCW)
							_GUICtrlRichEdit_Destroy($editOut)
							TCPShutdown()
							ExitLoop
						EndIf
						$sSvNick = TCPRecv($socket, 24)
						Sleep(100)
					Until StringLen($sSvNick) >= 1
					If $sSvNick = $sNick Then $sSvNick = $sSvNick & "_1" ; если ники сервера и клиента совпадают - переименовываем серверный
					If $sSvNick <> "" Then								; при получении ника соединение оборвалось
						_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Successful join with server [" & $ip & "], now on server - [" & $sSvNick & "]")
						GUICtrlSetState($inputStr, $GUI_ENABLE)
						GUICtrlSetState($buttSend, $GUI_ENABLE)
						GUICtrlSetOnEvent($buttSend, "_send_message")
						While $socket <> -1								; пока есть соединение - отправляем/принимаем сообщения
							If $abort = 1 Then	ExitLoop				; выход по команде пользователя
							Sleep(250)
							$sIn = TCPRecv($socket, 64)
							If StringLen($sIn) >=1 And $sIn = "###[email protected]@@" Then ; получена команда завершения соедининия от клиента
								_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Connection closed by " & $sSvNick)
								Sleep(2500)
								GUISetState(@SW_SHOW, $hSW)
								GUISetState(@SW_HIDE, $hCW)
								_GUICtrlRichEdit_Destroy($editOut)
								TCPShutdown()
								ExitLoop
							ElseIf StringLen($sIn) <> 0 Then			; отображение сообщения сервера
								_GUICtrlRichEdit_AppendText($editOut, @CRLF & $sSvNick & " << " & $sIn)
							EndIf
						WEnd
					EndIf
				EndIf
				Opt("GUIOnEventMode", 0)
			EndIf
		Case $msg = $tab
			If GUICtrlRead($tab) = 1 Then
				GUICtrlSetState($tabMain, $GUI_SHOW)
				_about($proj)
			EndIf
	EndSelect
WEnd

Func _editOut_create()
	$editOut = _GUICtrlRichEdit_Create($hCW, "", 5, 5, 990, 560, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_READONLY, $ES_MULTILINE))
	_GUICtrlRichEdit_SetBkColor($editOut, 0x000000)
	_GUICtrlRichEdit_SetFont($editOut, 15, "Courier New")
	_GUICtrlRichEdit_SetCharAttributes($editOut, "+bo")
	_GUICtrlRichEdit_SetCharColor($editOut, 0xFFFFFF)
EndFunc ;==>_editOut_create

Func _exit_CW()
	If $socket <> -1 Then TCPSend($socket, "###[email protected]@@")
	_GUICtrlRichEdit_AppendText($editOut, @CRLF & "Session is interrupted by user" & @CRLF & "Quit...")
	Sleep(1000)
	GUISetState(@SW_SHOW, $hSW)
	GUISetState(@SW_HIDE, $hCW)
	_GUICtrlRichEdit_Destroy($editOut)
	TCPShutdown()
	HotKeySet("^z")
	$abort = 1
EndFunc ;==>_exit_CW

Func _IsIP($ip)
	$aOctet = StringSplit($ip, ".")
	If StringRegExp($ip, "(\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z)") = 0 Then
		Return 0
	ElseIf $aOctet[1] = 0 Or $aOctet[1] > 255 Or $aOctet[2] > 255 Or $aOctet[3] > 255 Or $aOctet[4] > 255 Then
		Return -1
	Else
		Return 1
	EndIf
EndFunc ;==>_IsIP

Func _send_message()
	$sMess = GUICtrlRead($inputStr)
	If $sMess = "###[email protected]@@" Then
		$sMess = "I am a stupid idiot - try to use bug"
		TCPSend($socket, $sMess)
		GUICtrlSetData($inputStr, "")
		_GUICtrlRichEdit_AppendText($editOut, @CRLF & $sNick & " >> " & $sMess)
	ElseIf Not $sMess = "" Then
		TCPSend($socket, $sMess)
		GUICtrlSetData($inputStr, "")
		_GUICtrlRichEdit_AppendText($editOut,  @CRLF & $sNick & " >> " & $sMess)
	EndIf
EndFunc ;==>_send_message

Func _about($proj)
	$coord = WinGetPos($proj)
	WinSetState($hSW, "", @SW_DISABLE)
	$aboutGui = GUICreate("About " & $proj, 300, 120, $coord[0] - ((300 - $coord[2])/2) - 4, $coord[1] - ((120 - $coord[3])/2) - 11, -1, $WS_EX_TOOLWINDOW, $hSW)
	$drag = GUICtrlCreatePic("", 0, 0, 300, 120, -1, $GUI_WS_EX_PARENTDRAG)
	$prog_nm = GUICtrlCreateLabel($proj, 35, 42, 230, 25, $SS_CENTER)
	GUICtrlSetFont($prog_nm, 11, 800)
	GUICtrlCreateGroup("", 25, 20, 250, 58)
	$copy = GUICtrlCreateLabel("Copyright © " & @YEAR & " redline", 5, 102, 140, 15, $SS_LEFT)
	GUICtrlSetState($copy, 128)
	GUISetState(@SW_SHOW, $aboutGui)
	While 1
		$msg = GUIGetMsg($aboutGui)
		Select
			Case $msg = -3
				ExitLoop
		EndSelect
	WEnd
	WinSetState($hSW, "", @SW_ENABLE)
	GUIDelete($aboutGui)
EndFunc ;==>_about


Добавлено:
Сообщение автоматически объединено:

Но _RichEdit чем-то не устроил и переделал под _IE
Код:
Opt("TrayIconDebug", 1)
Opt("WinTitleMatchMode", 2)
Opt("TCPTimeout", 300)
Opt("GUICloseOnESC", 0)

#include <IE.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>

$proj = "Tet-a-Tet"

$hCW = GUICreate("Tet-a-Tet - Client", 1000, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_SYSMENU, $WS_CLIPCHILDREN))
GUISetIcon(@SystemDir & "\notepad.exe")
GUISetFont(15, 800, 0, "Courier New")

$inputStr = GUICtrlCreateInput("", 5, 570, 900, 27)
GUICtrlSetLimit($inputStr, 64)

$buttSend = GUICtrlCreateButton("Send", 910, 570, 85, 27, $BS_DEFPUSHBUTTON + $BS_FLAT)

$null = GUICtrlCreateDummy()
Dim $AccelKeys[4][2] = [["{F5}", $null],["^{F5}", $null],["^n", $null],["^p", $null]]
GUISetAccelerators($AccelKeys, $hCW) ; предотвращение нажатий кнопок "обновить", "печать", "создать новое окно" в IE

$hSW = GuiCreate("Tet-a-Tet", 200, 200)
GUISetIcon(@SystemDir & "\notepad.exe")

$tab = GUICtrlCreateTab(0, 0, 200, 200)

$tabMain = GUICtrlCreateTabItem("Main")

	$radioCl = GUICtrlCreateRadio("Client", 10, 30, 50)
	GUICtrlSetState($radioCl, $GUI_CHECKED)
	$radioSv = GUICtrlCreateRadio("Server", 70, 30, 50)

	$label_1 = GUICtrlCreateLabel("Enter your nickname:", 10, 55, 180, 17)
	$inputName = GuiCtrlCreateInput("user_" & Round(Random(999)), 10, 75, 180, 21)
	GUICtrlSetLimit($inputName, 24)

	$label_2 = GUICtrlCreateLabel("Enter server IP-address", 10, 105, 120, 17)
	$inputIp = GuiCtrlCreateInput("10.76.1.6", 10, 125, 110, 21)
	GUICtrlSetLimit($inputIp, 15)

	$label_3 = GUICtrlCreateLabel("port", 150, 105, 40, 17)
	$inputPort = GuiCtrlCreateInput("8462", 130, 125, 60, 21)
	GUICtrlSetLimit($inputPort, 8)

	$buttConnect = GUICtrlCreateButton("Connect", 50, 160, 100, 30, $BS_DEFPUSHBUTTON + $BS_FLAT)

$ab = GUICtrlCreateTabItem("About")

GUICtrlCreateTabitem("")

$objOut = 0
$sIns = ""
$socket = -1

GUISetState(@SW_SHOW, $hSW)

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = -3
			TCPShutdown()
			Exit
		Case $msg = $radioSv
			GUICtrlSetState($label_2, $GUI_DISABLE)
			GUICtrlSetState($inputIp, $GUI_DISABLE)
			GUICtrlSetData($buttConnect, "Start")
			WinSetTitle("Tet-a-Tet - Client", "", "Tet-a-Tet - Server")
		Case $msg = $radioCl
			GUICtrlSetState($label_2, $GUI_ENABLE)
			GUICtrlSetState($inputIp, $GUI_ENABLE)
			GUICtrlSetData($buttConnect, "Connect")
			WinSetTitle("Tet-a-Tet - Server", "", "Tet-a-Tet - Client")
		Case $msg = $buttConnect And GUICtrlRead($radioSv) = 1			; старт сервера
			$sNick = GUICtrlRead($inputName)
			$sPort = GUICtrlRead($inputPort)
				If $sNick = "" Or $sPort = "" Then
					GUISetState(@SW_DISABLE, $hSW)
					MsgBox(0x40000, "Error", "Fill empty fields")
					GUISetState(@SW_ENABLE, $hSW)
				Else													; создание сокета
					GUISetState(@SW_HIDE, $hSW)
					GUISetState(@SW_SHOW, $hCW)
					_IE_Out_create()
					GUICtrlSetState($inputStr, $GUI_DISABLE)
					GUICtrlSetState($buttSend, $GUI_DISABLE)
					TCPStartup()
					_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>Starting server</b></font>')
					_scrollToBottom($objOut)
					$count = 1
					Sleep(1000)
					$startSocket = TCPListen(@IPAddress1, $sPort)
					While $startSocket = -1								; повторное создание сокета
						$count += 1
						If $count = 11 Then								; после 10 неаудачных попыток - выход
							_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>All attempts not succesfuls
Quit...</b></font>
')
							_scrollToBottom($objOut)
							Sleep(2500)
							_exit_CW()
							ExitLoop
						EndIf
						_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
						_scrollToBottom($objOut)
						Sleep(1000)
						TCPCloseSocket($startSocket)
						Sleep(500)
						$startSocket = TCPListen(@IPAddress1, $sPort)
						Sleep(500)
					WEnd
					If $startSocket <> -1 Then							; ожидание входящих подключений
						Opt("GUIOnEventMode", 1)
						_IEDocInsertHTML($objOut, _
						'
<font color="#FFFFFF"><b>Server succesfuly running!
Waiting incoming connections press [Ctrl-Z] for canceling... </b></font>')
						_scrollToBottom($objOut)
						Sleep(1000)
						$abort = 0
						GUISetOnEvent("-3", "_exit_CW", $hCW)
						HotKeySet("^z", "_exit_CW")
							Do											; ожидание входящих подключений в цикле
								If $abort = 1 Then ExitLoop				; выход по команде пользователя
								_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
								_scrollToBottom($objOut)
								$socket = TCPAccept($startSocket)
								Sleep(1000)
							Until $socket <> -1
						HotKeySet("^z")
						If $abort = 0 Then								; клиент присоединился, получаем его Ник и IP-адрес
							Do
								If $abort = 1 Then ExitLoop						; выход по команде пользователя
								If $socket = -1 Then
									_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Connection lost</b></font>')
									_scrollToBottom($objOut)
									Sleep(2500)
									GUISetState(@SW_SHOW, $hSW)
									GUISetState(@SW_HIDE, $hCW)
									GUICtrlDelete($objOut)
									TCPShutdown()
									ExitLoop
								EndIf
								$sClNick_IP = TCPRecv($socket, 54)
								Sleep(100)
							Until StringLen($sClNick_IP) >= 1
							$aClNick_IP = StringSplit($sClNick_IP, "###[email protected]@@", 1)
							$sNick2 = $aClNick_IP[1]
							$sIP2 = $aClNick_IP[2]
							If $sNick2 = $sNick Then $sNick2 = $sNick2 & "_1" ; если ники сервера и клиента совпадают - переименовываем клиентский
							If $sNick2 <> "" Then				; при получении ника соединение оборвалось
								$sIns = '
<b><font color="#FFFFFF">Client </font><font color="#0000FF">' & $sNick2 _
								& '</font><font color="#FFFFFF"> connected from IP </font><font color="#0000FF">' & $sIP2 & '</font></b>
'
								_IEDocInsertHTML($objOut, $sIns)
								_scrollToBottom($objOut)
								TCPSend($socket, $sNick)					; передаем свой ник
								GUICtrlSetState($inputStr, $GUI_ENABLE)
								GUICtrlSetState($buttSend, $GUI_ENABLE)
								Opt("GUIOnEventMode", 1)
								GUISetOnEvent("-3", "_exit_CW", $hCW)
								GUICtrlSetOnEvent($buttSend, "_send_message")
								While $socket <> -1						; пока есть соединение - отправляем/принимаем сообщения
									If $abort = 1 Then	ExitLoop		; выход по команде пользователя
									Sleep(25)
									$sIn = TCPRecv($socket, 64)
									If StringLen($sIn) >=1 And $sIn = "###[email protected]@@" Then ; получена команда завершения соедининия от клиента
										$sIns = '
<b><font color="#FFFFFF">Connection closed by </font><font color="#0000FF">' & $sNick2 & _
										'</font><font color="#FFFFFF">
Quit...</font></b>'
										_IEDocInsertHTML($objOut, $sIns)
										_scrollToBottom($objOut)
										Sleep(2500)
										GUISetState(@SW_SHOW, $hSW)
										GUISetState(@SW_HIDE, $hCW)
										GUICtrlDelete($objOut)
										TCPShutdown()
										ExitLoop
									ElseIf StringLen($sIn) <> 0	Then	; отображение сообщения клиента
										$sIns = '<font color="#0000FF"><b>' & $sNick2 & '</b></font><font color="#FF0000"> << </font><font color="#00A800">' _
										& $sIn & '</font>
'
										_IEDocInsertHTML($objOut,$sIns)
										_scrollToBottom($objOut)
									EndIf
								WEnd
							EndIf
						EndIf
						Opt("GUIOnEventMode", 0)
					EndIf
				EndIf
		Case $msg = $buttConnect And GUICtrlRead($radioCl) = 1			; запуск клиента
			$sNick = GUICtrlRead($inputName)
			$ip = GUICtrlRead($inputIp)
			$sPort = GUICtrlRead($inputPort)
			If $ip = "" Or $sNick = "" Or $sPort = "" Then
				GUISetState(@SW_DISABLE, $hSW)
				MsgBox(0x40000, "Error", "Fill empty fields")
				GUISetState(@SW_ENABLE, $hSW)
			ElseIf _IsIP($ip) <> 1 Then									; проверка синтаксиса строки адреса сервера
				GUISetState(@SW_DISABLE, $hSW)
				MsgBox(0x40000, "Syntax Error", "IP-Address incorrect")
				GUISetState(@SW_ENABLE, $hSW)
			Else														; соединение с сервером
				Opt("GUIOnEventMode", 1)
				GUISetState(@SW_HIDE, $hSW)
				GUISetState(@SW_SHOW, $hCW)
				_IE_Out_create()
				GUICtrlSetState($inputStr, $GUI_DISABLE)
				GUICtrlSetState($buttSend, $GUI_DISABLE)
				TCPStartup()
				$sIns = '<b><font color="#FFFFFF">Connecting to server </font><font color="#0000FF">' & $ip _
				& '</font><font color="#FFFFFF"> press [Ctrl-Z] for canceling... </font></b>'
				_IEDocInsertHTML($objOut, $sIns)
				_scrollToBottom($objOut)
				Sleep(1000)
				$abort = 0
				GUISetOnEvent("-3", "_exit_CW", $hCW)
				HotKeySet("^z", "_exit_CW")
					Do													; попытки соединения с сервером в цикле
						If $abort = 1 Then ExitLoop						; выход по команде пользователя
						_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
						_scrollToBottom($objOut)
						$socket = TCPConnect($ip, $sPort)
						Sleep(1000)
					Until $socket <> -1
				HotKeySet("^z")
				If $abort = 0 Then										; после соединения передаем ник клиента и его IP-адрес на сервер, с использованием разделителя (=
					TCPSend($socket, $sNick & "###[email protected]@@" & @IPAddress1)
					Do													; ждем получения ника сервера
						If $abort = 1 Then	ExitLoop					; выход по команде пользователя
						If $socket = -1 Then
							_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Connection lost</b></font>')
							_scrollToBottom($objOut)
							Sleep(2500)
							GUISetState(@SW_SHOW, $hSW)
							GUISetState(@SW_HIDE, $hCW)
							GUICtrlDelete($objOut)
							TCPShutdown()
							ExitLoop
						EndIf
						$sSvNick = TCPRecv($socket, 24)
						Sleep(100)
					Until StringLen($sSvNick) >= 1
					If $sSvNick = $sNick Then $sSvNick = $sSvNick & "_1" ; если ники сервера и клиента совпадают - переименовываем серверный
					If $sSvNick <> "" Then								; при получении ника соединение оборвалось
						$sIns = '
<b><font color="#FFFFFF">Successful join with server </font><font color="#0000FF">' & $ip _
						& '</font><font color="#FFFFFF">, now on server - </font><font color="#0000FF">' & $sSvNick & '</font></b>
'
						_IEDocInsertHTML($objOut, $sIns)
						_scrollToBottom($objOut)
						GUICtrlSetState($inputStr, $GUI_ENABLE)
						GUICtrlSetState($buttSend, $GUI_ENABLE)
						GUICtrlSetOnEvent($buttSend, "_send_message")
						While $socket <> -1								; пока есть соединение - отправляем/принимаем сообщения
							If $abort = 1 Then	ExitLoop				; выход по команде пользователя
							Sleep(250)
							$sIn = TCPRecv($socket, 64)
							If StringLen($sIn) >=1 And $sIn = "###[email protected]@@" Then ; получена команда завершения соедининия от клиента
								$sIns = '
<b><font color="#FFFFFF">Connection closed by </font><font color="#0000FF">' & $sSvNick _
								& '</font><font color="#FFFFFF">
Quit...</font></b>'
								_IEDocInsertHTML($objOut, $sIns)
								_scrollToBottom($objOut)
								Sleep(2500)
								GUISetState(@SW_SHOW, $hSW)
								GUISetState(@SW_HIDE, $hCW)
								GUICtrlDelete($objOut)
								TCPShutdown()
								ExitLoop
							ElseIf StringLen($sIn) <> 0 Then			; отображение сообщения сервера
								$sIns = '<font color="#0000FF"><b>' & $sSvNick & '</b></font><font color="#FF0000"> << </font><font color="#00A800">' _
								& $sIn & '</font>
'
								_IEDocInsertHTML($objOut, $sIns)
								_scrollToBottom($objOut)
							EndIf
						WEnd
					EndIf
				EndIf
				Opt("GUIOnEventMode", 0)
			EndIf
		Case $msg = $tab
			If GUICtrlRead($tab) = 1 Then
				GUICtrlSetState($tabMain, $GUI_SHOW)
				_about($proj)
			EndIf
	EndSelect
WEnd

Func _IE_Out_create()
	$oIE = _IECreateEmbedded()
	$objOutCtrl = GUICtrlCreateObj($oIE, 5, 5, 990, 560)
	_IENavigate($oIE, 'about:blank')
	$s_html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' & @CR
	$s_html &= '<html><head><title>Chat Tet-a-Tet</title>'
	$s_html &= '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'
	$s_html &= '<style type="text/css">'
	$s_html &= 'body {background-color: #000000; margin="5"; font-family: "Courier New", sans-serif; font-size: 15pt;}'
	$s_html &= '</style>'
	$s_html &= '</head>'
	$s_html &= '<body></body></html>'
	_IEDocWriteHTML($oIE, $s_html)
	$objOut = _IETagNameGetCollection($oIE, "body", 0)
	_IEHeadInsertEventScript($oIE, "document", "oncontextmenu", "return false") ; запрет на появление контестного меню в IE
EndFunc ;==>_IE_Out_create

Func _exit_CW()
	If $socket <> -1 Then TCPSend($socket, "###[email protected]@@")
	_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Session is interrupted by user
Quit...</b></font>')
	_scrollToBottom($objOut)
	Sleep(1000)
	GUISetState(@SW_SHOW, $hSW)
	GUISetState(@SW_HIDE, $hCW)
	GUICtrlDelete($objOut)
	TCPShutdown()
	HotKeySet("^z")
	$abort = 1
EndFunc ;==>_exit_CW

Func _IsIP($ip)
	$aOctet = StringSplit($ip, ".")
	If StringRegExp($ip, "(\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z)") = 0 Then
		Return 0
	ElseIf $aOctet[1] = 0 Or $aOctet[1] > 255 Or $aOctet[2] > 255 Or $aOctet[3] > 255 Or $aOctet[4] > 255 Then
		Return -1
	Else
		Return 1
	EndIf
EndFunc ;==>_IsIP

Func _send_message()
	$sMess = GUICtrlRead($inputStr)
	If $sMess = "###[email protected]@@" Then
		$sMess = "I am a stupid idiot - try to use bug"
		TCPSend($socket, $sMess)
		GUICtrlSetData($inputStr, "")
		$sMess = '<font color="#00FF00"><b>' & $sNick & '</b></font><font color="#FF0000"> >> </font><font color="#00A800">' & $sMess & '</font>
'
		_IEDocInsertHTML($objOut, $sMess)
		_scrollToBottom($objOut)
	ElseIf Not $sMess = "" Then
		TCPSend($socket, $sMess)
		GUICtrlSetData($inputStr, "")
		$sMess = '<font color="#00FF00"><b>' & $sNick & '</b></font><font color="#FF0000"> >> </font><font color="#00A800">' & $sMess & '</font>
'
		_IEDocInsertHTML($objOut, $sMess)
		_scrollToBottom($objOut)
	EndIf
EndFunc ;==>_send_message

Func _scrollToBottom($oIE)
	$sHeight = $oIE.document.body.scrollHeight
	$oIE.document.parentwindow.scrollTo(0, $sHeight)
EndFunc ;==>_scrollToBottom

Func _about($proj)
	$coord = WinGetPos($proj)
	WinSetState($hSW, "", @SW_DISABLE)
	$aboutGui = GUICreate("About " & $proj, 300, 120, $coord[0] - ((300 - $coord[2])/2) - 4, $coord[1] - ((120 - $coord[3])/2) - 11, -1, $WS_EX_TOOLWINDOW, $hSW)
	$drag = GUICtrlCreatePic("", 0, 0, 300, 120, -1, $GUI_WS_EX_PARENTDRAG)
	$prog_nm = GUICtrlCreateLabel($proj, 35, 42, 230, 25, $SS_CENTER)
	GUICtrlSetFont($prog_nm, 11, 800)
	GUICtrlCreateGroup("", 25, 20, 250, 58)
	$copy = GUICtrlCreateLabel("Copyright © " & @YEAR & " Redline", 5, 102, 140, 15, $SS_LEFT)
	GUICtrlSetState($copy, 128)
	GUISetState(@SW_SHOW, $aboutGui)
	While 1
		$msg = GUIGetMsg($aboutGui)
		Select
			Case $msg = -3
				ExitLoop
		EndSelect
	WEnd
	WinSetState($hSW, "", @SW_ENABLE)
	GUIDelete($aboutGui)
EndFunc ;==>_about
 
Верх