I am getting the exception java.net.UnknowHostException:http://arbitrary-hero.dyndns.org/. I am attempting to connect to the address with a android client application I have made.
I have two computers one is running ubuntu 10.10 and the other is running windows 7. When I go to www.ipchicken.com on the windows 7 computer to check my ip I get 71.72.220.109 when I do a ifconfig from the command line on my linux machine I get 71.67.105.9. The 71.72.220.109 goes to my server application on the windows 7 computer the 71.67.105.9 and the address arbitrary-hero.dyndns.org goes to the apache server on my ubuntu 10.10 machine. The computers are in the same house using the same network and I dont understand why they have those different addresses. Also I am trying to get them to both use the URL.
String webserver = "71.67.105.9"; //does not work
String everythingelseinthehouse = "71.72.220.109"; //works
String weburl = "http://arbitrary-hero.dyndns.org/"; // does not work
Socket sock = new Socket (weburl , 13267);
//Socket sock = new Socket (address_everythingelse , 13267);
//Socket sock = new Socket (address_room , 13267);
This is where I declare my socket, sorry about the extra code but I have tried all possible combinations to make this work.
If you would like more code from me to help me solve this problem please ask I would be very happy to resolve this issue.
URL is not a host name, use InetAddress.getByName("something.dyndns.org") instead.
Other stuff about chickens is totally not clear in the question :)
Edit 0:
... when I do a ifconfig from the command line on my linux machine I get 71.67.105.9 ...
This tells me that your Linux box is either statically configured with this IP, or your router is setup to treat wired connections differently.
You need to add this premission to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Also, you need to use InetAddress for using the domain name instead of the IP address:
Socket sock = new Socket(InetAddress.getByName(weburl) , 13267);
Related
I am working now on simple program to send file through TCP using Java. I have a problem that I am not able to connect between computers ( I am testing application using router and local IP adresses).
I start connection by:
sendSocket = new Socket(sendIp, port);
and I am trying to recieve connection on next PC by:
servsock = new ServerSocket(port);
recieveSocket = servsock.accept();
where
port is 12222,
sendIp is 169.254.5.47 ( second computer that recieves)
and myIP is 192.168.0.52 ( computer that sends)
What I am doing wrong?
I always use the same port, and I see on TCPView that java app uses that port.
Maybe I assign wrong IP, or my firewall blocks somehow.
Best regards and thanks,
Chris
If this is a Windows network, the IP 169.254.5.47 means the host did not obtain a valid IP address from the DHCP. In a standard local network both addresses should be on the same class C range (192.168.0.*).
You have to first solve this physical issue with your network and test it using ping (each host should be able to ping the other and see replies).
i'm trying to make a Java application that connects to an Android application.
Both my pc and my phone are connected to the same network.
This is the Java client wich runs on my pc:
client = new Socket("muffin", port);
System.out.println("Connected");
output = new ObjectOutputStream(client.getOutputStream());
output.flush();
input = new ObjectInputStream(client.getInputStream());
System.out.println("Streams ready");
And this is the Android application wich works as the server:
server = new ServerSocket(port);
socket = server.accept();
Log.i("Server", "Connected");
output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
input = new ObjectInputStream(socket.getInputStream());
In the manifest i added the permissions:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
As you can see i'm trying to connect from my pc to the android server by using its hostname (i changed my android hostname to "muffin"), but it doesn't connect and it throws an exception:
java.net.UnknownHostException: muffin
If instead of the hostname i use the ip address, it works without problems.
It looks like it cannot find a device on LAN called "muffin", but you can see from this screenshot of my modem page that the name is right:
That said, i tryed to use the android application as the client and the java program as the server, but it looks like android has some problems because it didn't connect to my pc even by using the ip address instead of the hostname.
Do you have any idea on how to fix this problem?
Thanks in advance and sorry for my english, it's not my mother tongue.
I solved the problem, i've had to allow the traffic on the specific port through the windows firewall.
Now i can connect to the android application using its hostname.
You can't do:
new Socket("muffin", port);
There is a difference between Hostname, and Host, so:
java.net.UnknownHostException: muffin
means that the host "muffin" doesn't exist, and that's true: the only existing host is 192.168.1.105, who has a hostname who is "muffin".
So you should have done:
new Socket("192.168.1.105", port);
It is not possible to get a host from it's hostname : so if it is the only way for you to do it, you will have to do a huge scan of all the local network, and then see which host that is connected has the good hostname. As this method is much much harder, i realy recommand you to find another way to do it :)
I have been having trouble about socket usage in java. First of all, let me explain what I want to do with sockets in java. I want to connect my laptop over the Internet via it. My laptop has a server and a client must connect over the internet. Because I have a router to handle my local network and I do not want to lead a port on the router to my laptop, I need to follow the path "internet->router->localNetwork->mylaptop". The problem is I have found a way to use both the internet ip address and the local ip address; However, it throws an exception : "Exception in thread "main" java.net.BindException: Address already in use"
The code I try is :
InetAddress addr = InetAddress.getByName("XXX.XXX.XXX.XXX");
InetAddress local = InetAddress.getByName("YYY.YYY.YYY.YYY");
Socket socket = new Socket(addr, 1111, local, 1111); // The line I have got exception
With leading router port to my laptop, I can run this code for the similar purposes:
Socket socket = new Socket("XXX.XXX.XXX.XXX", 1111);
*Xs stand for internet ip address
*Ys stand for local ip address
*Codes are belongs to client side of code
As far as I understand, you have a router with Internet (WAN) IP XXX.XXX.XXX.XXX with NAT, and you have a laptop with Local (LAN) IP YYY.YYY.YYY.YYY connected to the router, and you assume that
Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111);
Will connect to the laptop. That is not correct.
Documentation of the constructor of Socket class you are using tells:
Creates a socket and connects it to the specified remote host on the specified remote port. The Socket will also bind() to the local address and port supplied.
That is not what you want.
You can't connect to a device behind NAT like this. You have to "lead a port on the router".
You don't need to specify the local address:port of the Socket, and you are doing so incorrectly. Remove the last two parameters.
I installed the WordnetSimilarity server on my Ubuntu.
I launch it with the command:
$ similarity_server.pl --logfile server.log
Now I want to use it from my Java/Groovy app, and I wrote this code to get the server version:
// open connection
Socket kkSocket = new Socket("localhost", 31134);
def out = new PrintWriter(kkSocket.getOutputStream(), true);
def inbuf = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
out.write("v") // command for the server
out.write("\015\012") // end of message
out.flush()
// so far so good
println inbuf.readLine()
// no response, hanging...
Nothing happens, and the server log is empty. The server protocol is defined in here: http://search.cpan.org/~tpederse/WordNet-Similarity-2.05/utils/similarity_server.pl
The server is definitely running, because if I stop it, the socket allocation fails.
Any hint?
Cheers, Mulone
It looks like it should work. I suspect that there is a problem with the server. Some things to try:
Are there any other clients you can use to see if the server is responding properly?
Is there any "verbose" output option for the server?
Is the server able to access whatever resources it needs, e.g., WordNet over an internet connection?
Can you debug the server process?
On the client, you can try reading one character at a time.
I am having trouble connecting my online application to others across another network. I am able to give them the hostAddress to connect when we are on the same network but when we are doing it across the internet the generated host address doesn't allow a connection, nor does using the ip address gotten from online sites such as whatismyip.com
My biggest issue isn't debugging this code, because it works over intra-network but The server doesn't see attempts when we try to move to different networks. Also, the test port I am using is 2222.
InetAddress addr = InetAddress.getLocalHost();
String hostname = addr.getHostName();
System.out.println("Hostname: " + hostname);
System.out.println("IP: " + addr.getHostAddress());
I display the host to the server when it is starting
if (isClient) {
System.out.println("Client Starting..");
clientSocket = new Socket(host, port_number);
} else {
System.out.println("Server Starting..");
echoServer = new ServerSocket(port_number);
clientSocket = echoServer.accept();
System.out.println("Warning, Incoming Game..");
}
If it works on your local lan but not across the internet then one or both peers are probably on a NAT'ed connection, meaning that the public IP address you see on the internet is not the same as the IP address of the machine you are trying to talk to. You would probably need to set up some kind of port forwarding to allow your app to connect.
The issue is probably firewall configuration.
Assuming you're testing this at home (it would usually be more complex from a university or company).
Usually you'll need to configure your router to let port 2222 open (you can also open port 5555 and tell your router to redirect to the host you want on your lan (there might be many), and port 2222).
To sum up:
other user ----> internet ----> [your modem] internet_IP -> [your router] lan_IP -> your computer lan_IP2
internet_IP is given by your ISP; find it here: http://www.whatismyip.com/
lan_IP: you defined in your router configuration. Typically: 192.168.0.1
lan_IP2: usually given to your PC by the router (DHCP). Find it by typing ipconfig (Windows) or ifconfig (Linux).
You need to tell your router to open port 2222, and route it to lan_IP2 on port 2222.
Configuring the router is usually done by connecting on its http interface: http://192.168.0.1
Some additional information might be helpful. Can you ping the machine from where you are? Are you attempting to go through a firewall? You say they work over localhost or local network - those are a bit different. Do you mean a network using local space (i.e. 10...* or 192.168.. or the like)? You say you are using a test ip of 2222 - that is not an ip address. Is that the domain of the address? Or is that the port number?