I have a Python server. Each time I change the network the IP changes. I want it to have a static IP over all networks so it can receive data without customizing the code every time.
I want to do the same for a Java server too.
You may talk with your ISP to rent a static IP address, although I would recommend using name instead of IP address. Means, trust a DNS server to translate the IP to the name and and thus even if the IP is changing, it will give the new IP each time. How? well there are free online name services (such as "no-ip") that you can register your IP each time, to a fixed name address.
Related
I'm programming a little server example with Sockets in Java.
Currently I'm using this for testing:
server= new Socket(InetAdress.getByName("127.0.0.1"),3333)
but my plan is to move it to my Raspberry Pi.
Unfortunately, I don't have a static IP address.
What is the proper way to update the IP address in the code?
I thought about storing it on a webserver and accessing it via an API, but that doesn't sound very secure, and it might slow down my code.
First off, your use of InetAdress.getByName() is redundant. Socket has a constructor that accepts a String as input:
server = new Socket("127.0.0.1", 3333)
That said, you should register a static domain name for your server, and set its DNS records to point at your server's IP. Then clients can use that domain name to connect to the server, instead of using the IP address directly:
server = new Socket("mydomain", 3333)
If your server does not have a static IP, there are plenty of free and cheap "Dynamic DNS" services available, which allow you to update your domain with your current IP address whenever it changes (typically using automated tools to simplify the detection-and-update process).
If the server is behind a router, many routers have built-in support for updating various DynDNS services for you. If your router supports this, you can configure it with your DynDNS account information so it can automatically update the domain whenever its WAN IP changes.
I am working on task where I need to access URL https://localhost:8080/er/heartbeat which gave data from heartbeat.xml from other VM.
Need help in this.
You cannot access "localhost" (127.0.0.1, etc) from another machine. The 127.x.x.x net range is for host-local use only. The packets sent to this range are not (should not be) routed outside of this machine / virtual machine.
You need to use an external IP address for this machine or a DNS name that resolves to an external IP address. (It could be a private IP address, provided that the other VM knows how to route packets to it.)
References:
How to view the localhost of another computer in the same network?
The Wikipedia page on localhost.
If you are in the same network you just need to know the IP of your machine and access it like:
https://other.machine.ip:8080/er/heartbeat
Let's say we are hosting on a Personal Computer and Server Program is written in Java.
1.If we host server using static IP-address then does that means we can change machine and replace it with other ones, restart machine as many times we want and our Client will still be able to communicate with us after system is back?
2.if we host server using Dynamic IP-address then just by restarting once the machine we have to tell every single client out there that new IP-address is this one?
3.Will Dynamic IP-addresses change even if we don't restart the machine ?
Yes, a static ip address means that it is fixed. There is more to the whole system, of course, since there is resolution of an IP to a MAC address. Nonetheless, a static IP (assuming it is only on the network once) means that any machine with that IP will respond. So a client can always connect to the IP address.
Note: not a very friendly way to go.
Just because something has a "dynamic" IP address does not necessarily mean it changes every single time. Using DHCP it is possible to assign the same IP address to the same MAC address each time. It is a much better approach than hardcoding an IP address to a machine.
In addition, you really should not have your clients use an IP address to connect. They should look up the machine by a name in DNS. You can coordinate the DNS lookup to the DHCP, so machines do not need to do anything but resolve the hostname.
However, as your question stands, if a machine uses DHCP and does not receive the same IP address each time, and you have your clients connecting by IP address, then on each new assignment the clients would need the new IP address.
Whether a machine's IP address updates even when it does not restart is a policy that is controlled by the DHCP server. In general, there is a renewal time for an IP address. Without going into great deal, the client during the DHCP conversation may request the same IP address, but it is up to the server as to whether to hand out the same one or not. Conversely, most servers are configured to hand out the same IP address to a given MAC address as long as the DHCP cache is current. It is completely a policy decision.
At the end of the day, however, it seems like you are attempting to tie clients to a server's IP address, and this is not a good strategy. It is a better strategy to use DNS and have the clients resolve a hostname. If I am incorrectly inferring your intent, I apologize.
NOTE: I have used DHCP as the way to give out dynamic IP addresses. You might use some other strategy, but I think the concept is the same.
1: Yes, if the server has a static IP clients will always be able to count on the server being at that IP address.
2: Most likely, yes. In many networks the DHCP server will give the same IP back to a machine that has rebooted but you certainly should not count on that.
3: Yes - dynamically assigned IP addresses have a "TTL" - a time to live. This may be a long time (weeks or more) but they still could expire and change. Most often the machine will get the same IP back but, again, you should not count on that.
Is there any possible way to differentiate online IP Address from Local/Other Machine IP on LAN in Java?
I am working on a application, there is a need to identify the Local IP/LAN IP and Online IP address input by user.
Thanks in advance.
As far as I am aware, there is no way to do this based solely on the IP (and that is not specific to Java, but based on the way networks work).
If you have additional information, however, you may be able to do this. There are three networks of IP addresses that are not used on the internet. Those are:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
If you know the LAN IP addresses will be from specific ranges (including the network the host is in on which your application is runnning), you can differentiate; however - and do not try this at home kids since it will give you headaches - if you use IP addresses in your LAN that are also used on the internet, you will not only have address conflicts, but also trouble to distinguish between online and LAN IPs.
Something else though; if your users try to "connect" via the internet, but are behind a NAT, your application will only see the source of their traffic as the public IP of the gateway doing the NAT for your users. So, for example, if two of your users are somewhere in a LAN with IPs from 10.0.1.0/24, but their gateway has a public IP of 123.123.123.123, your application will see BOTH users as having the IP 123.123.123.123
You might have to come up with a different way of authentication if you intend to use this in a way similar to VPN, or you have to know all the public IPs of all gateways of all of your users who are behind NATs.
A note on terminology, as Marcelo pointed out: afaik, "online" and "offline" are not terms usually used with IPs. We rather speak of "public" (the ones seen on the internet) and "private" IPs (those within your own network noone on the internet can see).
You can get the external IP using some API such as http://automation.whatismyip.com/n09230945.asp. If you can reach that API and get the IP, you are "online" - i.e., connected to the internet. If you can't, you are "offline" (unless the host is down, etc).
If you need the local host, you can use
InetAddress thisIp =InetAddress.getLocalHost();
System.out.println("IP:"+thisIp.getHostAddress())
Please clarify what you consider an "offline IP address", as I've never heard of such concept before.
Java Socket Program did not work for WAN
I have written a TCP IP socket program which works fine in my LAN.
One of my friend is at bangalore He ran the server and I ran the
client with the host name of my friend's IP. In this case my
socket program did not work.
You said that your program is attempting to connect to host 192.168.1.107 port 46216.
192 prefix specifies it is a class C address and is private. Making your program connect to that will force it to remain on the local network searching for that node. You will need to find the IP address of your router (you can use http://whatismyip.org/ to find this out). Then go into your router settings and forward port 46216 to 192.168.1.107 (your node), or even better, your MAC address which is not subject to change (in case your router is running DHCP).
on a side note, it isn't good to hardcode IP addresses. Simply use a textfield to avoid having to redistribute the client when your IP is changed, as it is likely you have a dynamic IP from your ISP.
Your friend running the server is most likely behind either a firewall or NAT. Make sure you are using the external IP address and if necessary port forwarding the packets to the correct IP.
The IP address you gave seems to be a local address, rather than a public internet address. If you are looking for 192.x.x.x, you will not make it out to "the internet", but will be confined behind your router.
WhatIsMyIP is a good way of getting a public IP address, and THAT is the address you should use in your connection. Also, be sure to forward any ports that will be used by your program, because otherwise your router will likely filter the traffic and still create an issue.
You could use an implementation of STUNT or other NAT Traversal protocol.
The ip of computer on thih u deployed your server program is not in your reach.
192.x.x.x ip means (class C) it is for local subnet.
You need to have change your ip address of your net-adapter so that your router could route it through internet.