module RubyMud require 'socket' require 'logger' $clientConnections = [] port = (ARGV[0] || 1234).to_i server = TCPServer.new(port) # Create a logger logger = Logger.new('logfile.log') print "rubymud - server started\n" loop do socket = server.accept() Thread.start do # one thread per client s = socket port = s.peeraddr[1] name = s.peeraddr[2] addr = s.peeraddr[3] logger.info('client connected') { "*** recieving from #{name}:#{port}" } begin newClientConnection = ClientConnection.new(s) $clientConnections.push(newClientConnection) while c = s.getc() # read a line at a time newClientConnection.receiveChar(c) #puts "#{addr} [#{Time.now}]: #{line}" #raise ClientQuitError if line =~ /^die\r?$/ end rescue ClientQuitError logger.info('client disconnected') { "*** #{name}:#{port}" } puts "*** #{name}:#{port} disconnected\n" rescue => detail print "\n\n ---------\n !!!ERROR!!!\n" print $! print detail.backtrace.join("\n") print "---------\n\n" logger.fatal('client thread fatal error') {$!+"\n"+detail.backtrace.join("\n")} ensure Players.remove(newClientConnection) if (newClientConnection.player != nil) newClientConnection.player.parent.removeItem(newClientConnection.player) end s.close() # close socket on error end puts "*** done with #{name}:#{port}" end end logger.close end