Jump to content



Photo

TCP SERVER & CLIENT examples.... to learn from


  • Please log in to reply
2 replies to this topic

#1 CodyBarrett

CodyBarrett

    I LOVE Juicy Fruit!!!

  • Active Members
  • PipPipPipPipPipPip
  • 1,225 posts

Posted 23 July 2009 - 07:26 PM

recently i got a PM asking how to make a TCP server....

so here i wrote an example server & client this morning...
(client you can start first.. provided that the server starts and connects before 3 seconds is up

SERVER!!!!!!
AutoIt         
$0 = 0 $00 = 0 $000 = 0 $ip = InputBox ('IP=?','Please choose a funtioning IP for your server...',@IPAddress1) ;Makes the servers IP address... default is your @IPADDRESS1. $port = InputBox ('Port=?','Please Choose a port # that is not being used...',Random (100, 10000,1)) ;Makes the port # can be anything between 1 and 60000. ;(the maximum is a guess i don't know how many ports there are butits close). ;and ONLY if the port is not already being used. $max_connections = InputBox ('Maximim Connections=?', 'Please choose an amount of clients that would be able to connect to the server...(recommended that its minimal)',Random (1,1000, 1)) ;How many clients can be connected FUNCTIONABLY to the server... any more and it will not function correctly on the clients side. TCPStartup () $TCPListen = TCPListen ($ip, $port, $max_connections) If $TCPListen = -1 Then _Exit_ () ;Creates a listening Socket Dim $Socket_Data[$max_connections + 1][3] ;add more to the second array to add data. ;(ex) 2 would have another column for data. ;you could make Usernames or ClientIP's in it... anything you want. ;Socket_data EXAMPLE ;$Socket_Data[0][0] = AMOUNT OF CURRENT CLIENTS ;$Socket_Data[1][0] = client 1 ;$Socket_Data[2][0] = client 2 ;$Socket_Data[n][0] = client n ProgressOn ('Socket Data', 'Reseting Socket Data...') For $0 = 0 To $max_connections     $Socket_Data[$0][0] = 0     ;To reset the Socket array.     ProgressSet (Round (($0 / $max_connections) * 100),'','Reseting Socket Data...')     Sleep (10) Next ProgressOff () While 1     _Accept_Connection ()     _Recv_From_Sockets_ ()     Sleep (100) WEnd Func _Accept_Connection ()     If $Socket_Data[0][0] = $max_connections Then Return     ;Makes sure no more Connections can be made.     $Accept = TCPAccept ($TCPListen)     ;Accepts incomming connections.     If $Accept = -1 Then Return     For $0 = 1 To $max_connections         If $Socket_Data[$0][0] = 0 Then             ;Find the first open socket.             $Socket_Data[$0][0] = $Accept             ;assigns that socket the incomming connection.             Do                 $Recv = TCPRecv ($Accept, 1000000)             Until $Recv <> ''             $Recv = StringSplit ($Recv, '^')             $Socket_Data[$0][1] = $Recv[1]             $Socket_Data[$0][2] = $Recv[2]             ;$Socket_Data[$0][n] = $Recv[n] DEPENDING O WHAT YOU DIMMED THE $SOCKET_DATA AS!!!             $Socket_Data[0][0] += 1             ;adds one to the Socket list.             $00 = 'New Client'             _Broadcast_To_Sockets_ ($00)             ;Broadcasts to all the clients.             $0 = 0             $00 = 0             Return         EndIf     Next     Return EndFunc Func _Broadcast_To_Sockets_ ($0)     For $00 = 1 To $max_connections         TCPSend ($Socket_Data[$00][0], $0)         ;sends to every client.     Next     $0 = 0     $00 = 0     Return EndFunc Func _Recv_From_Sockets_ ()     For $0 = 1 To $max_connections         $Recv = TCPRecv ($Socket_Data[$0][0],1000000)         _Broadcast_To_Sockets_ ($Recv)     Next EndFunc Func _Exit_ ()     For $0 = 1 To $max_connections         TCPCloseSocket ($Socket_Data[$0][0])     Next     TCPCloseSocket ($TCPListen)     TCPShutdown ()     Exit EndFunc


CLIENT!!!

AutoIt         
#include <GUICONSTANTS.AU3> #include <WINDOWSCONSTANTS.AU3> #include <STATICCONSTANTS.AU3> #include <EDITCONSTANTS.AU3> #include <MISC.AU3> #Include <GuiEdit.au3> #Include <WinAPI.au3> #Include <DATE.au3> Opt ('GUIoneventmode', 1) $GUIStyle = BitOR($WS_DLGFRAME,$WS_POPUP, $WS_VISIBLE) $GUIStyleEx = BitOR ($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE) $EditStyle = BitOR($ES_MULTILINE,$WS_VSCROLL) $EditStyleEx = BitOR($EditStyle, $ES_READONLY) $W = 0xFFFFFF $B = 0x0 $Titleb = 0x7F7F7F TCPStartup() $0 = 0 $00 = 0 $000 = 0 $ip = TCPNameToIP (InputBox('IP=?', 'Please choose a funtioning IP of your server...', @IPAddress1)) ;The servers IP address... default is your @IPADDRESS1. MUST BE THE SERVERS IP ADDRESS CANNOT BE YOUR CLIENTS!!! $port = InputBox('Port=?', 'Please Choose a port # that is specified by the server...', Random(100, 10000, 1)) ;Makes the port # can be anything between 1 and 60000. ;(the maximum is a guess i don't know how many ports there are butits close). ;and ONLY if the port is not already being used. ;MUST BE SERVER OPENED PORT NOT ONE ON YOUR COMPUTER!!! For $0 = 0 To 10     $Socket = TCPConnect($ip, $port)     ;Connects to an open socket on the server...     If $Socket <> -1 Then ExitLoop     TCPCloseSocket($Socket)     Sleep(300) Next If $Socket = -1 Then _Exit () TCPSend ($Socket, @UserName & '^EXAMPLE DATA') $GUI = GUICreate (@ScriptName, 300, 200) $Console = GUICtrlCreateEdit ('',0,0,300,150,$EditStyleEx) $Send = GUICtrlCreateEdit ('',0,150,300,50,$EditStyle) GUICtrlSetLimit (-1, 250) GUISetOnEvent ($GUI_EVENT_CLOSE, '_Exit', $GUI) GUISetState () HotKeySet('{ENTER}', '_Send') While 1     _Recv_From_Server ()     Sleep(100) WEnd Func _Send ()     $0 = GUICtrlRead ($Send)     If $0 = '' Then Return     TCPSend($Socket, $0)     GUICtrlSetData ($Send,'') EndFunc   ;==>_send_ Func _Recv_From_Server ()     $Recv = TCPRecv($Socket, 1000000)     If $Recv = '' Then Return     _GUICtrlEdit_AppendText ($Console,_NowTime () & ' -- ' & $Recv & @CRLF) EndFunc   ;==>_Recv_From_Server_ Func _Minn ()     WinSetState ($GUI, '', @SW_MINIMIZE) EndFunc Func _Exit ()     TCPCloseSocket ($Socket)     TCPShutdown()     Exit EndFunc   ;==>_Exit_


you can replace the Tooltips with a GUI and controls... but for now i'll leave it at that... BTCP in my sig is also a working TCP multiclient Chat room


BTW!

i don't know how to configure it over a router\highspeed for i have dialup and a VPN

have fun learning!




EDIT


i made the client use GUI controls.. it just is more simpler that way

Edited by CodyBarrett, 11 October 2009 - 05:03 PM.








#2 petenyc1

petenyc1

    Seeker

  • Active Members
  • 6 posts

Posted 29 October 2011 - 05:32 PM

This is awesome!! Just a couple of questions please. I know that this was a quick example (amazing by the way that you just through it together).

1. How would you recommend recovery from the server going down and then restarting?

2. I see that you go through and find the first available socket on the server. What about when a client exits gracefully and ungracefully?

Thanks this was a HUGE help!!!

Peter

#3 darippaxp

darippaxp

    Seeker

  • New Members
  • 4 posts

Posted 16 December 2011 - 03:26 PM

thanks for the examples, im gonna try to work with em




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users