You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebindings/qtruby/rubylib/examples/network/clientserver/server/server.rb

116 lines
2.8 KiB

require 'Qt'
=begin
The ClientSocket class provides a socket that is connected with a client.
For every client that connects to the server, the server creates a new
instance of this class.
=end
class ClientSocket < TQt::Socket
def initialize(sock, parent=nil, name=nil)
super( parent, name )
@line = 0
connect( self, TQ_SIGNAL('readyRead()'),
TQ_SLOT('readClient()') )
connect( self, TQ_SIGNAL('connectionClosed()'),
TQ_SLOT('deleteLater()') )
setSocket( sock )
end
signals 'logText(const TQString&)'
slots 'readClient()'
def readClient()
ts = TQt::TextStream.new( self )
while canReadLine() do
str = ts.readLine()
emit logText( tr("Read: '%s'\n" % str) )
ts << @line << ": " << str
# 'endl' needs to be called like this in ruby
endl(ts)
emit logText( tr("Wrote: '%d: %s'\n" % [@line, str]) )
@line += 1
end
ts.dispose()
end
end
=begin
The SimpleServer class handles new connections to the server. For every
client that connects, it creates a new ClientSocket -- that instance is now
responsible for the communication with that client.
=end
class SimpleServer < TQt::ServerSocket
def initialize( parent=nil )
super( 4242, 1, parent )
if !ok()
tqWarning("Failed to bind to port 4242")
exit(1)
end
end
def newConnection( socket )
s = ClientSocket.new( socket, self )
emit newConnect( s )
end
# The type of the argument is 'TQSocket*', not
# 'ClientSocket*' as only types in the Smoke
# library can be used for types in Signals
signals 'newConnect(TQSocket*)'
end
=begin
The ServerInfo class provides a small GUI for the server. It also creates the
SimpleServer and as a result the server.
=end
class ServerInfo < TQt::VBox
def initialize()
super
@server = SimpleServer.new( self )
itext = tr(
"This is a small server example.\n" +
"Connect with the client now."
)
lb = TQt::Label.new( itext, self )
lb.setAlignment( AlignHCenter )
@infoText = TQt::TextView.new( self )
quit = TQt::PushButton.new( tr("Quit") , self )
# See the comment above about why the 'ClientSocket*'
# type cannot be used
connect( @server, TQ_SIGNAL('newConnect(TQSocket*)'),
TQ_SLOT('newConnect(TQSocket*)') )
connect( quit, TQ_SIGNAL('clicked()'), $qApp,
TQ_SLOT('quit()') )
end
slots 'newConnect(TQSocket*)', 'connectionClosed()'
def newConnect( s )
@infoText.append( tr("New connection\n") )
connect( s, TQ_SIGNAL('logText(const TQString&)'),
@infoText, TQ_SLOT('append(const TQString&)') )
connect( s, TQ_SIGNAL('connectionClosed()'),
TQ_SLOT('connectionClosed()') )
end
def connectionClosed()
@infoText.append( tr("Client closed connection\n") )
end
end
app = TQt::Application.new( ARGV )
info = ServerInfo.new
app.mainWidget = info
info.show
app.exec