School Assignment? Project Due Tomorrow? Chat LIVE With A Programming Expert!

Welcome to Dream.In.Code
Become an Expert!

Join 300,430 Programmers for FREE! Get instant access to thousands of experts, tutorials, code snippets, and more! There are 1,490 people online right now. Registration is fast and FREE... Join Now!




Working with sockets: Managing input from client

 

Working with sockets: Managing input from client, Managing input from client

TroyDowling

16 Jun, 2009 - 02:30 PM
Post #1

New D.I.C Head
*

Joined: 13 Jun, 2009
Posts: 3


My Contributions
Hello, this is my first post here at DIC! Anyways, I've been working with Ruby for a while now but have just started to move into networking with it. As a project to learn about how it works, I wanted to build a simple Rock, Paper, Scissors online application. Basicially, two instances of the application run; one is the server, one is the client, both are players. How it should work is, the player who is also the server should enter their choice of rock paper or scissors and then the program will wait for input from the client via a socket. Then, the winner is decided and this process repeats. However, there is something wrong with my program, so as of now, the two players do not have to remain in sync with eachother. The client is able to enter their three choices all before the server player enters their first. Hopefully you understand what I am trying to accomplish and what the problem is. Below is the code for the entire program. Thanks in advance.

CODE

# Rock Paper Scissors
# 0.2.3
# GNU\GPL
# Troy Dowling
# A multiplayer, networked game of rock, papper, scissors

require "socket"                                                    # This tells the ruby interpreter to include the libraries for creating and managing sockets.

class Game
    
    def initialize
        while true
            system "cls"
            system "clear"
            intro = <<INTRO                                                # This is a special way to create a string. Everything between the <<FOOBAR and FOOBAR is the string exactly how you format it in the IDE (that's why it does not follow normal indentation)
Hello and welcome to Rock Paper Scissors
    1) Host a server
    2) Join a server
    3) Help + Rules
    4) Quit
INTRO
            puts intro
            i = gets.chomp.strip.to_i                                # Take the user's input, remove white space and turn the string into an integer.
            (i == 1) ? server() :                                    # This is a turnary conditional. Just a shorthand conditional... (CONDITIONAL) ? (IF TRUE) : (IF FALSE)
            (i == 2) ? join() :
            (i == 3) ? help() :
            (i == 4) ? exit : (puts "You must choose 1, 2 or 3.")
        end
    end
              
    
    def server
        begin
            print "Address (default is localhost): "
            host = gets.chomp.strip
            (host == "") ? (host = "localhost") : (nil)                # If they did not enter their own address for the server, use 'localhost' as the default, otherwise do nothing.
            print "Port (default is 7994): "
            port = gets.chomp.strip
            (port == "") ? (port = 7994) : (nil)                    # If they did not enter their own port for the server, use '7994' as the default, otherwise do nothing.
            
            puts "Starting server..."
            server = TCPserver.new(host,port)                        # Create an instance of a TCP Server using the address and port defined above.
        rescue
            puts "The server could not start! Try using a different port."
            retry
        end
        server_address = server.addr                                # Save the address and port date of this server and...
        puts "Server running on #{server_address.join('::')}"        # ...show this data. (It's actually an array of values, so we join all these values together in a string with "::" between each entry.)
        while true
            Thread.start(server.accept) do |@sock|                    # Start a new thread that waits for a client to join the server
                puts "#{@sock} connected at #{Time.now}"
                bestOf = 3                                            # How many rounds to play total. I.e., the best of n rounds.
                roundCount = 0                                        # How many complete rounds have passed.
                while roundCount < bestOf
                    print "Rock, Paper, Scissors: "
                    call = gets.chomp.strip.downcase
                    puts "Waiting on client..."
                    clientCall = @sock.gets.chomp.strip.downcase    # THIS NEEDS TO ONLY ACCEPT ONE ENTRY AT A TIME. AS OF NOW, THE SERVER-SIDE WAITS FOR ALL THREE OF THE CLIENT'S ENTRIES BEFORE CONTINUING!!!
                    winOrLose(call, clientCall)
                    roundCount += 1
                end
                puts "#{@sock} disconnected."
                s.close
            end
        end
    end
    
    def join
        quitOrNot = 0
        begin
            print "Address: "
            host = gets.chomp.strip
            print "Port (default is 7994): "
            port = gets.chomp.strip
            (port == "") ? (port = 7994) : (nil)                    # If they did not enter their own port for the server, use '7994' as the default, otherwise do nothing.
            
            print("Connecting...")

            clientsock = TCPsocket.open(host, port)                    # Open up a socket (connection) to the server
        rescue
            puts " Could not open a connection to that server."
            quitOrNot += 1
            (quitOrNot < 3) ? (retry) : (puts "Exiting program..."; exit)
        end
        print(" done\n")
        puts("Connected from #{clientsock.addr[2]}::#{clientsock.addr[3]} to #{clientsock.peeraddr[2]}::#{clientsock.addr[3]}")
        bestOf = 3                                                    # How many rounds to play total. I.e., the best of n rounds.
        roundCount = 0                                                # How many complete rounds have passed.
        while roundCount < bestOf
            print "Rock, Paper, Scissors: "
            call = gets.chomp.strip.downcase
            clientsock.write(call)
            roundCount += 1                                            # Add one to the roundCount
        end
        clientsock.close                                            # Close the connection to the server
    end
    
    def winOrLose(serv, client)
        puts serv
        puts client
    end
    
    def help()
        system "cls"
        system "clear"
        puts <<EOL
Welcome to Rock, Paper, Scissors Online!
----------------------------------------

HOW TO START A GAME SERVER

1) Run the game
2) Select "Host a Server"
3) In most cases you can leave the server address as the default 'localhost'
4) The same goes for the port number
5) The server is now running and waiting for a client to join before beginning the game!

HOW TO JOIN A SERVER

1) Run the game
2) Select "Join a server"
3) Enter the address of the server you wish to connect to.
4) Enter the port you wish to connect to; this is likely 7994.
5) You are now connected!

Press any key to return to menu...

EOL
        STDIN.gets
    end
    
end

prog = Game.new


This post has been edited by TroyDowling: 17 Jun, 2009 - 01:51 PM

User is offlineProfile CardPM
+Quote Post

Fast ReplyReply to this topicStart new topic

Time is now: 11/8/09 12:34AM

Live Help!

Be Social

Dream.In.Code RSS Feed Dream.In.Code LinkedIn Group Follow Us On Twitter Fan Us On Facebook

Tutorials

Programming

Web Development

Reference Sheets

Code Snippets

DIC Chatroom

Bye Bye Ads

Monthly Drawing

Thumb Drive

Top Contributors

Top 10 Kudos This Month