53

When I'm trying to set up a socket server, I've got an error message:

Exception in thread "main" java.net.BindException: Cannot assign requested address: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
    at java.net.ServerSocket.bind(ServerSocket.java:328)
    at java.net.ServerSocket.<init>(ServerSocket.java:194)
    at java.net.ServerSocket.<init>(ServerSocket.java:106)
    at socketyserver.SocketyServer.main(SocketyServer.java:12)
Java Result: 1

Whole code is simplest as it can be:

public static void main(String[] args) throws UnknownHostException, IOException
{
    ServerSocket serverSocket;
    serverSocket = new ServerSocket(9999);
}

I'm 100% sure that my ports are forwarded, Windows Firewall is off. Nothing blocks port 9999. What else can go wrong?

jww
  • 83,594
  • 69
  • 338
  • 732
Adrian Adamczyk
  • 2,560
  • 4
  • 23
  • 41
  • The javadoc of `BindException` states: Signals that an error occurred while attempting to bind a socket to a local address and port. Typically, the port is in use, or the requested local address could not be assigned. Are you certain you do not have your program running twice, where the first instance uses the port and the second instance throws the exception since the port is already in use by the first instance – Robin Jan 22 '12 at 22:09
  • 1
    Sounds like either another copy of your server is already running (double check task manager) or you just killed another version of the server and the socket is "lingering" for a while. – Joachim Isaksson Jan 22 '12 at 22:10
  • 5
    See http://nirlevy.blogspot.co.il/2007/12/tomcat-javanetbindexception-cannot.html "Cannot assign requested address" means that (in your case) it's probable that "localhost" does not map to a valid ip. – Nir Levy Sep 19 '12 at 10:18

13 Answers13

33

It may be related to a misconfiguration in your /etc/hosts. In my case, it was like this: 192.168.1.11 localhost instead of 127.0.0.1 localhost

Oueslati Bechir
  • 902
  • 2
  • 10
  • 15
21

As other people have pointed out, it is most likely related to another process using port 9999. On Windows, run the command:

netstat -a -n | grep "LIST"

And it should list anything there that's hogging the port. Of course you'll then have to go and manually kill those programs in Task Manager. If this still doesn't work, replace the line:

serverSocket = new ServerSocket(9999);

With:

InetAddress locIP = InetAddress.getByName("192.168.1.20");
serverSocket = new ServerSocket(9999, 0, locIP);

Of course replace 192.168.1.20 with your actual IP address, or use 127.0.0.1.

Daniel Da Cunha
  • 964
  • 10
  • 12
Marvin Pinto
  • 27,868
  • 7
  • 35
  • 52
15

Just for others who may look at this answer in the hope of solving a similar problem, I got a similar message because my ip address changed.

java.net.BindException: Cannot assign requested address: bind
    at sun.nio.ch.Net.bind(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:182)
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:260)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.Server.doStart(Server.java:273)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
cquezel
  • 2,567
  • 22
  • 27
13

The error says Cannot assign requested address. This means that you need to use the correct address for one of your network interfaces or 0.0.0.0 to accept connections from all interfaces.

The other solutions about ports only work after sometimes-failing black magic (like working after some computer restarts but not others) because the port is completely irrelevant.

Olathe
  • 1,859
  • 1
  • 15
  • 23
7

Java documentation for java.net.BindExcpetion,

Signals that an error occurred while attempting to bind a socket to a local address and port. Typically, the port is in use, or the requested local address could not be assigned.

Cause:

The error is due to the second condition mentioned above. When you start a server(Tomcat,Jetty etc) it listens to a port and bind a socket to an address and port. In Windows and Linux the hostname is resolved to IP address from /etc/hosts This host to IP address mapping file can be found at C:\Windows\System32\Drivers\etc\hosts. If this mapping is changed and the host name cannot be resolved to the IP address you get the error message.

Solution:

Edit the hosts file and correct the mapping for hostname and IP using admin privileges.

eg:

#127.0.0.1 localhost
192.168.52.1 localhost

Read more: java.net.BindException : cannot assign requested address.

Lucky
  • 14,677
  • 16
  • 104
  • 145
  • This is a different error than what the question was about. – dan.m was user2321368 Sep 27 '16 at 15:24
  • The question was about an error message "Cannot assign requested address". That error message is NOT the same as the error message your answer illustrates, or solves. – dan.m was user2321368 Sep 27 '16 at 23:16
  • 1
    This should be the accepted answer. 'Cannot assign requested address error' is due to to the OS being unable to resolve the 'localhost', which is required to start and shutdown the server. This is most commonly caused by a wrongly configured hosts file. This error is NOT particularly due to port being in use. I commented all the entries except this '127.0.0.1 localhost' from my /etc/hosts file to resolve similar issue w/ my tomcat app. – Rishi Feb 22 '17 at 21:23
  • 1
    This solution is not correct. `localhost` must map to `127.0.0.1, and the 'real' IP address must map to a hostname other than `localhost`. – user207421 Oct 16 '17 at 07:26
6

if your are using server, there's "public network IP" and "internal network IP". Use the "internal network IP" in your file /etc/hosts and "public network IP" in your code. if you use "public network IP" in your file /etc/hosts then you will get this error.

Nick Qian
  • 61
  • 1
  • 4
4

For me it was because a previous jmeter.properties change was still in play

httpclient.localaddress=12.34.56.78
Kevin Reilly
  • 5,632
  • 2
  • 21
  • 17
0

In my case, delete from /etc/hosts

  • 127.0.0.1 localhost
  • 192.168.100.20 localhost <<<<---- (delete or comment)
Cahedral
  • 37
  • 8
0

I came across this error when copying configurations from one server to another.

I had the old host's hostname in my ${JETTY_BASE}/start.ini jetty.host property. Setting the correct jetty.host property value solved the issue for me.

Hope this helps someone in the future who has to work on multiple servers at once.

vixelated
  • 3
  • 1
0

if you happened on CentOS?

You should try to this.

$ service network restart

or

reboot your server.

seyeon
  • 2,942
  • 2
  • 13
  • 12
0

The port is taken by another process. Possibly an unterminated older run of your program. Make sure your program has exited cleanly or kill it.

Bozho
  • 554,002
  • 136
  • 1,025
  • 1,121
  • It's not possible! I've just restarted my PC, it doesn't help. – Adrian Adamczyk Jan 22 '12 at 22:23
  • 1
    This is incorrect. If the port was taken by another process the error would be "java.net.BindException: Address already in use". The error "java.net.BindException: Cannot assign requested address" problem is because you've tried to open a socket on invalid IP address. – dan.m was user2321368 Sep 27 '16 at 15:21
0

As the error states, it can't bind - which typically means it's in use by another process. From a command line run:

netstat -a -n -o

Interrogate the output for port 9999 in use in the left hand column.

For more information: http://www.zdnetasia.com/see-what-process-is-using-a-tcp-port-62047950.htm

Dan Hardiker
  • 2,903
  • 14
  • 18
  • As the error states, the address isn't available, which means the ports are completely irrelevant. – Olathe Oct 21 '13 at 20:01
  • 2
    This is incorrect. If the port was taken by another process the error would be "java.net.BindException: Address already in use". The error "java.net.BindException: Cannot assign requested address" problem is because you've tried to open a socket on invalid IP address. – dan.m was user2321368 Sep 27 '16 at 15:24
-3

java.net.BindException: Cannot assign requested address

According to BindException documentation, it basically:

Signals that an error occurred while attempting to bind a socket to a local address and port. Typically, the port is in use, or the requested local address could not be assigned.

So try the following command:

sudo lsof -i:8983

to double check if any application is using the same port and kill it.

If that's not the case, make sure that your IP address to which you're trying to bind is correct (it's correctly assigned to your network interface).

kenorb
  • 118,428
  • 63
  • 588
  • 624
  • 1
    This is incorrect. If the port was taken by another process the error would be "java.net.BindException: Address already in use". The error "java.net.BindException: Cannot assign requested address" problem is because you've tried to open a socket on invalid IP address. – dan.m was user2321368 Sep 27 '16 at 15:25
  • @dan.mwasuser2321368 Thanks for the suggestion, I've improved my answer, please check my edit. – kenorb Sep 27 '16 at 15:52