Chat TCP Problem

  • Hallo

    ich hab ein Problem. Und zwar hat ein User ein Chatscript geschrieben so ziemlich basis. Er kam mit TCP nicht weiter und hat dann mit FTP angefangen. Aber ich hab ihn ein wenig starthilfe gegeben damit er sein TCP-Script weiter aufbaut. Allerdings komm ich bei eine stelle selbst nicht weiter. Also ich habe 2x das gleiche Code.. nur das bei zweite Code kein TCPListen() befindet damit Server nicht nochmal gestartet wird was so oder so wegen Ports nicht geht. Auf jedenfall frage ich mich, wenn ein Client der sich zum Server connected die Daten, was nach Server gesendet wird wie ich das wieder zu Client senden kann?. Da Client kein TCPListen() anwendet kann man doch nichts zu Client senden oder? Oder muss Client auch ein TCPListen anwenden?? Aber was mache ich wenn man jetzt ein Client sein Programm 3x startet..? Die Ports freigeben? :S

    Also ich habe eigentlich wie Spiele gedacht. Jeder verbindet sich zum Server.. die Clients müssen keine Portsfreigeben, kein listen. Quasi wenn man Porttest macht ist dieser Port zu.

    Zweite frage wär. Wie kriege ich hin das Server nicht nur nach ein Client wartet sondern das mehrere sich da einklinken können

    also

    [autoit]


    Do
    $tcpaccept = TCPAccept($tcplisten)
    Until $tcpaccept <> -1

    [/autoit]


    Ohne das Funktioniert bei mir gar nichts.

    Hier mal Code

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Chat", 429, 292, 192, 124)
    $Edit1 = GUICtrlCreateEdit("", 8, 8, 409, 201, BitOR($ES_AUTOVSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL))
    $Input1 = GUICtrlCreateInput("", 8, 224, 97, 21, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
    GUICtrlSetLimit(-1, 26)
    $Label1 = GUICtrlCreateLabel(":", 112, 224, 7, 17)
    $Input2 = GUICtrlCreateInput("", 120, 224, 297, 21)
    $Button1 = GUICtrlCreateButton("Namen ändern", 8, 256, 75, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Senden", 96, 256, 75, 25, $WS_GROUP)
    $Button3 = GUICtrlCreateButton("Schriftart", 344, 256, 75, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    ;Vari

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()
    $tcplisten = TCPListen("127.0.0.1", 3000,100)
    $tcpconnect = TCPConnect("127.0.0.1", 3000)
    $tcpaccept = -1
    Do
    $tcpaccept = TCPAccept($tcplisten)
    Until $tcpaccept <> -1

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    _Server()
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit
    Case $Button1

    Case $Button2
    _send(GUICtrlRead($Input2))
    Case $Button3
    EndSwitch
    sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func _Server()
    $s_Recv = TCPRecv($tcpaccept, 2048)
    IF $s_Recv <> "" Then
    Local $s_Chatverlauf = GUICtrlRead($Edit1)
    GUICtrlSetData($Edit1, $s_Chatverlauf & @CRLF & "MaZy" & " : " & $s_Recv)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _send($s_message)
    If $s_message = "" Then
    MsgBox(0, "Fehler", "Nichts wurde als Text eingetragen!")
    Return 0
    EndIf
    TCPSend($tcpconnect, $s_message)
    EndFunc

    [/autoit]


    Also das ist die Version Server und Client in eins. Client version zum Testen nur hab ich _server() und tcplisten() usw entfernt.

    Ich hoffe könnt mir beim logisches denken helfen ^^

    EDIT: IN Sufu hab ich nur gefunden das man sufu benutzen soll wenn es um chat ging lol
    Außer 2 beiträge wo jemand sein Script postet aber bei ihn blick ich total nicht durch..

  • Da der Server Daten an den Client schickt, muss dieser aus TCPListen() verwenden ^^

    Man kann es auch ganz umständlich machen, indem der Server zum Beispiel in eine Textdatei den Chate schreibt und dann auf nen FTP Schickt und diese Datei dann von den Clienten abgerufen und angezeigt wird.
    Ist aber meiner Meinung nach viel zu umständlich ^^

  • in der Hilfe steht das:
    Erzeugt einen Abhör-Anschluss ("Socket") für eine eingehende Verbindung.


    also heist es fereinfacht: du sagst den script er ist der server.

    wenn mehrer user connecten sollen, erstellste mit tcpaccept ein array

    also so ungefähr

    [autoit]


    $maxuser = 15
    $maxuserarray[$maxuser -1]
    For $i = 0 To $maxusers -1
    $maxuserarray[$i] = 1
    Next
    $tmp = TCPAccept($tcp_server)
    For $index = 0 To $maxusers -1
    If $tmp <> -1 Then
    If $maxuserarray[$index] = 1 Then
    $maxuserarray[$index]= $tmp
    $tmp = -1
    EndIf
    EndIf
    Next

    [/autoit]

    nicht getestet(jetzt so geschrieben)

  • Danke für dein TIPP. Ich bin jetzt sehr weit gekommen. Es können mehrere rein und hab auch meine erste befehl eingebaut. /me ^^.

    Spoiler anzeigen
    [autoit]

    $tcpaccept2 = TCPAccept($tcplisten)
    If $tcpaccept2 <> -1 then
    for $i = 0 to $maxuser -1
    $iIndex = _ArraySearch($tcpaccept, $tcpaccept2)
    if @error Then
    _ArrayInsert($tcpaccept, $i, $tcpaccept2)
    $curuser = $curuser + 1
    EndIf
    Next
    EndIf

    [/autoit]

    So jetzt bleibt mir das Problem mit Clientside. Muss ich bei ihn TCPListen() anwenden???