Difference between localhost and the ip address

socketstcpip

If bind a socket in Python to localhost,8200 this is accessible via http://localhost:8200/. but not http://x.x.x.x:8200/

If bind a socket in Python to x.x.x.x,8200, machinename,8200 this is accessible via http://x.x.x.x:8200/ and http://machinename:8200/, but not http://localhost:8200/

I thought localhost meant 'this machine', and that using it would 'loop back' to the machine's ip address, but it appears to be different ips.

Is 127.0.0.1 always a different ip address to the machines ip address?

update:

I understand that the actual numbers are different, but what does the loopback do?

For example wikepedia says that
'pointing a web browser to the URLs http://127.0.0.1/ or http://localhost/ will access that computer's own web site'

but that web site will also be accessible on x.x.x.x, and presumably be set up with a single socket on x.x.x.x. So how do both references work then?

conclusion:

I think I finally understand that 127.0.0.1 and x.x.x.x work like this

--127.0.0.1 ==\
               >- Computer
--x.x.x.x   ==/

and not

--127.0.0.1 ==\
--------------- x.x.x.x >- Computer

or

--x.x.x.x ==\
--------------- 127.0.0.1 >- Computer

Thanks all for the help

Best Answer

To answer your question.

127.0.0.1 is not just a different ip address to the machine ip address, it's a different interface as well. 127.0.0.1 should not be seen on the local network. It's a special internal IP address for the loopback adapter.

x.x.x.x will be your ethernet card.

by the way 'localhost' is simply an entry in your hosts file that points to 127.0.0.1

If you bind a socket to 127.0.0.1:8200 then only clients running locally will be able to access it and only with http://127.0.0.1:8200 or http://localhost:8200 (or a dns or hosts file entry that points to 127.0.0.1).

A socket bound to x.x.x.x:8200 will only be available through http://x.x.x.x:8200 or a dns or hosts file entry that points to that.

Binding a socket to 127.0.0.1 does not automatically make it available on the ethernet interface as well.

Thats why you can't connect to x.x.x.x:8200

You can bind port 8200 to all available interfaces (0.0.0.0) then it should work.

Other features of the loopback adapter:

The loopback interface is a virtual interface. It's often used to allow programs to talk to each other on the same machine. It is not a way to reference the machine IP address. 127.0.0.1 IS the IP address of the loopback virtual adaptor.

The other thing about the loopback adapter is that because it's virtual it doesn't actually pass any packets through to the network card.