Echo Client This implements a client that opens a server connection, sends messages from stdin, receives server replies and sends them to stdout. #!/usr/local/bin/tclsh7.5
# Read data from a channel (the server socket) and put it to stdout # this implements receiving and handling (viewing) a server reply proc read_sock {sock} {
set l [gets $sock] puts stdout "ServerReply:$l"
}
# Read a line of text from stdin and send it to the echoserver socket, # on eof stdin closedown the echoserver client socket connection # this implements sending a message to the Server. proc read_stdin {wsock} {
global eventLoop set l [gets stdin] if {[eof stdin]} { close $wsock ;# close the socket client connection set eventLoop "done" ;# terminate the vwait (eventloop) } else { puts $wsock $l ;# send the data to the server }
}
# open the connection to the echo server... set eshost "scoda" set esport 9999
# this is a synchronous connection: # The command does not return until the server responds to the # connection request set esvrSock socket $eshost $esport
#if {eof $esvrSock} { # connection closed .. abort }
# Setup monitoring on the socket so that when there is data to be # read the proc "read_sock" is called fileevent $esvrSock readable list read_sock $esvrSock
# configure channel modes # ensure the socket is line buffered so we can get a line of text # at a time (Cos thats what the server expects)... # Depending on your needs you may also want this unbuffered so # you don't block in reading a chunk larger than has been fed # into the socket # i.e fconfigure $esvrSock -blocking off
fconfigure $esvrSock -buffering line
# set up our keyboard read event handler: # Vector stdin data to the socket fileevent stdin readable list read_stdin $esvrSock
# message indicating connection accepted and we're ready to go puts "EchoServerClient Connected to echo server" puts "...what you type should be echoed."
# wait for and handle either socket or stdin events... vwait eventLoop
puts "Client Finished"
Another option is to do an asynchronous client connection
set esvrSock socket -async $eshost $esport
# .... do whatever that we can't connect synchronously...
# resync with the connection, #Socket becomes writable when connection available fileevent $esvrSock writable { set connect 1 } vwait connect
# will 'block' here till connection up (or eof or error)
fileevent $esvrSock writable {} ;# remove previous handler
if {eof $esvrSock} { # connection closed .. abort }
# set translation, buffering and/or blocking modes fconfigure $esvrSock -translation {auto crlf} -buffering line
...
Echo Server Server that reflects its client messages back to the source
#!/usr/local/bin/tclsh7.5
set svcPort 9999
# Implement the service # This example just writes the info back to the client... proc doService {sock msg} {
# puts $sock "echosrv:$l" puts $sock "$l"
}
# Handles the input from the client and client shutdown proc svcHandler {sock} {
set l [gets $sock] ;# get the client packet if {[eof $sock]} { ;# client gone or finished close $sock ;# release the servers client channel } else { doService $sock $l }
}
# Accept-Connection handler for Server. # called When client makes a connection to the server # Its passed the channel we're to communicate with the client on, # The address of the client and the port we're using # # Setup a handler for (incoming) communication on # the client channel - send connection Reply and log connection proc accept {sock addr port} {
# if {[badConnect $addr]} { # close $sock # return # } # Setup handler for future communication on client socket fileevent $sock readable [list svcHandler $sock] # Read client input in lines, disable blocking I/O fconfigure $sock -buffering line -blocking 0 # Send Acceptance string to client puts $sock "$addr:$port, You are connected to the echo server." puts $sock "It is now [exec date]" # log the connection puts "Accepted connection from $addr at [exec date]"
}
# Create a server socket on port $svcPort. # Call proc accept when a client attempts a connection. socket -server accept $svcPort vwait events ;# handle events till variable events is set
I can not send/receive message from client/server