So why two different methods? Is there any Difference between the two if the way they function?
Not necessarily. But there is enormous difference in what they mean (semantics).
Idempotent is an important semantic difference; on an unreliable network, messages get lost. Furthermore there is no way to determine whether the lost message was the request or the response.
What an idempotent semantic allows us to do is arrange that the client resends the request if it times out waiting for a response.
Furthermore, because the idempotent promise is part of the HTTP standard itself, generic components can safely decide on their own to resend the request without needing to know anything about the domain specific context of the request.
PUT on its own also has some interesting implications:
An origin server MUST NOT send a validator header field (Section 7.2), such as an ETag or Last-Modified field, in a successful response to PUT unless the request's representation data was saved without any transformation applied to the body (i.e., the resource's new representation data is identical to the representation data received in the PUT request) and the validator field value reflects the new representation. This requirement allows a user agent to know when the representation body it has in memory remains current as a result of the PUT, thus not in need of being retrieved again from the origin server, and that the new validator(s) received in the response can be used for future conditional requests in order to prevent accidental overwrites (Section 5.2).
In your server implementation, you could use exactly the same logic to implement POST as you do PUT; but without the semantics promised by the method, generic clients can't take advantage.