An easy explaination:
Sockets sends objects through the network to communicate with each others.
Rmi uses callbacks to each classes metods. Like if the server contains an metod called: public void addThisitem, then with rmi, the client can call this metod directly and make it excecute whatever code it contains.
Sockets are a tool for communication over a network(e.g. the internet).
RMI is an interface for calling methods of classes that are to be run on another computer. RMI uses sockets to pass the call to the other computers.
RMI is a possible use for sockets, one of many. If you specifically want to call methods of classes on another computer, RMI saves you the trouble of having to create the socket code yourself - you can just use RMI. For any other use, you should just use sockets.
Note that calling methods on another computer does give you alot of power, and as such you may be able to create just about any network program with just RMI instead of sockets, so long as you control the protocol. However, that's sort of abusing what RMI does, and one major problem with that is security - letting network computers run methods on your computer, even if you limit what those methods are, is somewhat of a security risk.
Also, a protocol implemented directly with sockets would most likely require less bandwidth, as it sends just what it needs to, rather than the vast amount of information needed to call a method. Saving on bandwidth is always a good thing.
And finally, using RMI for communication isn't necessarily easier than using sockets. Each has its own learning curve.