Williams began his career at Eastleigh before joining Winchester City in 2008. However, in November 2008 Williams returned to Eastleigh on loan before signing a new contract in February 2009. In October 2009, Eastleigh received a club record transfer fee from the Stags where he then played for one season before returning to Eastleigh for a third time after a successful one-month-long loan.
Williams joined Championship side team Reading on 18 January on an 18-month contract after a successful trial period which included scoring for the reserves. Reading paid f50,000 to sign Williams. Other clubs that were rumoured to be interested in signing Williams were Southampton, Brighton and Wycombe Wanderers.
Despite never being named in a squad to face opposition, Williams has travelled with the first team squad including Bramhall Lane when they played Sheffield United and could be seen warming up on the field before kick off with teammate Simon Church. On 22 February 2011, Williams was named on the bench to face Millwall at the Madejski for the first time.
For the 2011–12 season, Williams joined firstly Rotherham United on loan until January, and then Northampton Town. He scored his first professional goal for Rotherham in the 2–1 loss to Crawley Town.
In July 2012, Williams joined St Johnstone on a week’s trial with a view to a loan move, though ultimately the club did not follow up their interest. On 7 August he joined Conferance National side Woking on a season long loan and scored his first goal for the club on 28 August in a 4–1 home defeat to Braintree Town. He had to wait nearly three months for his second goal, scoring in a 2–1 home defeat to Alfreton Town on 17 November. Williams returned to Reading at the end of the season having scored four goals in 31 appearances in all competitions.
He was released by Reading on 24 May 2013 having never made a first team appearance in his two-and-a-half years with the club. On 8 August, two days before the start of the 2013–14 Conferance Premier season, Williams joined Aldershot Town having trialed with the team during pre-season.
Williams was the third highest goalscorer in the Conference Premier in the 2013/14 season with 24 goals, and he remained with Aldershot for the 2014/15 season.
On 12 June 2015, Williams joined League Two side Stevenage. In November 2015, he dropped back down into the National League, signing for Forest Green Rovers on a one-month loan. He made his debut as a substitute in a 2–0 home win over Altringham on 28 November 2015. He returned to Stevenage at the end of his loan spell, but on 15 January 2016 re-joined Forest Green permanently after Stevenage had agreed to mutually terminate his contract.
He went on to appear in the 2015/16 National League play-offs for Forest Green and scored the winning goal in a play-off semi-final first leg away win at Dover Athletic He started the play-off final on 15 May 2016 against Grimsby Town at Wembley Stadium, but ended up on the losing side. The next day on 16 May 2016 it was confirmed that he had been released.
On 4 June 2016 Williams joined National League side Torquyay United after agreeing terms with the club. After a season in which Williams’ goals proved vital in saving United from relegation, he left the club and joined National League rivals Bromley. After spending half of the 2017/2018 season at Bromley, Williams re-signed for Torquay United on 26 January 2018.
In June 2019, Williams joined Weymouth.