Hi Leute,
ich bräuchte mal eure Hilfe. Ich habe mir den Chat vom AutoIt-Wiki kopiert und bearbeitet. Erstmal der Quelltext:
Spoiler anzeigen
SERVER:
#include <date.au3>
TCPStartup()
$serverIP = '127.0.0.1'
$serverport = 80
$srvSocket = TCPListen($serverIP,$serverport)
[/autoit] [autoit][/autoit] [autoit]#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Server Kontrolle", 625, 443, 700, 50)
$Edit1 = GUICtrlCreateEdit("", 16, 16, 593, 417)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$con = TCPAccept($srvSocket)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If $con >=0 Then
$rev = ''
$clientIP = SocketToIP($con)
ConsoleWrite($clientIP)
While True
$rev &= TCPRecv($con,4096)
If @error Then ExitLoop
WEnd
If StringLeft($rev,8) = 'MSGPORT#' Then
$sp = StringSplit($rev,'#')
$cltSocket = TCPConnect($clientIP,$sp[UBound($sp) - 1])
If $clientIP <> -1 Then
TCPSend($cltSocket,GUICtrlRead($Edit1))
TCPCloseSocket($cltSocket)
EndIf
ElseIf $rev <> '' Then
$str = GUICtrlRead($Edit1)
$str &= @TAB & $rev & @CRLF
GUICtrlSetData($Edit1,$str)
EndIf
EndIf
WEnd
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
[/autoit] [autoit][/autoit] [autoit]$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
[/autoit] [autoit][/autoit] [autoit]Return $aRet
EndFunc
CLIENT 1:
[autoit]$ip = '127.0.0.1' ; normalerweise @IPAddress1
$port = 7663
$serverIP = "127.0.0.1" ; normalerweise die IP des Servers
$serverport = 80
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
While $Name = ""
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
WEnd
$Textspeicher = ""
HotKeySet("{enter}", "senden")
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]AdlibRegister('empfang',5000)
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate($Name & ' - Chatclient', 625, 336, 700, 360)
$Edit1 = GUICtrlCreateEdit("", 16, 16, 601, 281, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
$Button1 = GUICtrlCreateButton("Senden", 528, 304, 89, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$mySocket = TCPListen($ip,$port)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
sleep(50)
empfang()
$con = TCPAccept($mySocket)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
$Ende = MsgBox(4, "Beenden?", "Wollen Sie wirklich den Chat beenden?")
If $Ende = 6 Then
Exit
EndIf
Case $Button1
senden()
EndSwitch
If $con >=0 Then
$rev = ''
While True
$rev &= TCPRecv($con,2048)
If @error Then ExitLoop
WEnd
If $rev <> '' Then
$str = $rev
GUICtrlSetData($Edit1,$str)
EndIf
EndIf
WEnd
[/autoit] [autoit][/autoit] [autoit]Func senden()
If GUICtrlRead($Input1) = "!name" Then
$srvSocket = TCPConnect($serverIP, $serverport)
$EXNAME = $Name
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
While $Name = ""
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
WEnd
GUICtrlDelete($Input1)
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
TCPSend($srvSocket, $EXNAME & " hat seinen Namen in " & $Name & " geändert.")
ControlFocus($Name & ' - Chatclient', "", $Input1)
TCPCloseSocket($srvSocket)
Elseif GUICtrlRead($Input1) <> "" Then
$Textspeicher = GUICtrlRead($Input1)
GUICtrlDelete($Input1)
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
ControlFocus($Name & ' - Chatclient', "", $Input1)
$srvSocket = TCPConnect($serverIP, $serverport)
If $srvSocket = -1 Then Exit
TCPSend($srvSocket, $Name & " : " & $Textspeicher)
TCPCloseSocket($srvSocket)
Else
MsgBox(0, "Error", "Bitte einen Text eingeben", 5)
EndIf
EndFunc
Func empfang()
AdlibUnRegister()
$srvSocket = TCPConnect($serverIP, $serverport)
If $srvSocket = -1 Then
Exit
EndIf
TCPSend($srvSocket, 'MSGPORT#' & $port)
TCPCloseSocket($srvSocket)
AdlibRegister('empfang',5000)
EndFunc
TCPShutdown()
und der CLIENT 2:
$ip = '127.0.0.1' ; normalerweise @IPAddress1
$port = 7662
$serverIP = "127.0.0.1" ; normalerweise die IP des Servers
$serverport = 80
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
While $Name = ""
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
WEnd
$Textspeicher = ""
HotKeySet("{enter}", "senden")
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]AdlibRegister('empfang',5000)
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate($Name & ' - Chatclient', 625, 336, 700, 360)
$Edit1 = GUICtrlCreateEdit("", 16, 16, 601, 281, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
$Button1 = GUICtrlCreateButton("Senden", 528, 304, 89, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$mySocket = TCPListen($ip,$port)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
sleep(50)
empfang()
$con = TCPAccept($mySocket)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
$Ende = MsgBox(4, "Beenden?", "Wollen Sie wirklich den Chat beenden?")
If $Ende = 6 Then
Exit
EndIf
Case $Button1
senden()
EndSwitch
If $con >=0 Then
$rev = ''
While True
$rev &= TCPRecv($con,2048)
If @error Then ExitLoop
WEnd
If $rev <> '' Then
$str = $rev
GUICtrlSetData($Edit1,$str)
EndIf
EndIf
WEnd
[/autoit] [autoit][/autoit] [autoit]Func senden()
If GUICtrlRead($Input1) = "!name" Then
$srvSocket = TCPConnect($serverIP, $serverport)
$EXNAME = $Name
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
While $Name = ""
$Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
WEnd
GUICtrlDelete($Input1)
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
TCPSend($srvSocket, $EXNAME & " hat seinen Namen in " & $Name & " geändert.")
ControlFocus($Name & ' - Chatclient', "", $Input1)
TCPCloseSocket($srvSocket)
Elseif GUICtrlRead($Input1) <> "" Then
$Textspeicher = GUICtrlRead($Input1)
GUICtrlDelete($Input1)
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
ControlFocus($Name & ' - Chatclient', "", $Input1)
$srvSocket = TCPConnect($serverIP, $serverport)
If $srvSocket = -1 Then Exit
TCPSend($srvSocket, $Name & " : " & $Textspeicher)
TCPCloseSocket($srvSocket)
Else
MsgBox(0, "Error", "Bitte einen Text eingeben", 5)
EndIf
EndFunc
Func empfang()
AdlibUnRegister()
$srvSocket = TCPConnect($serverIP, $serverport)
If $srvSocket = -1 Then
Exit
EndIf
TCPSend($srvSocket, 'MSGPORT#' & $port)
TCPCloseSocket($srvSocket)
AdlibRegister('empfang',5000)
EndFunc
TCPShutdown()
so... wenn ich jetzt den Server&die beiden Clients starte, kann ich chatten. Soweit, sogut. Jetzt habe ich eine Funktion (aufrufbar, indem man "!name" in den Chat eintippt) eingefügt, mit der man seinen Namen ändern kann. Nach dem ändern soll eine Mitteilung ("X hat einen Namen in Y geändert.") erscheinen. Das klappt auch - allerdings laggt daraufhin der andere Client und kurze Zeit später stürzt der Server ab. Der Server stürzt allerdings auch ohne Namensändern nach ca 2 Minuten ab.
Auserdem habe ich noch eine Frage: kann man den Titel der GUI bzw den Text von Input-Boxen mit einem Befehl ändern? Ich musste mich leider der n00bmethode
[autoit]
GUICtrlDelete($Input1)
$Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
bedienen.
Danke schonmal