2012-01-22 30 views
40

Khi tôi đang cố gắng để thiết lập một máy chủ socket, tôi đã có một thông báo lỗi:Không thể gán địa chỉ yêu cầu: JVM_Bind

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 

Tổng code đang đơn giản nhất vì nó có thể là:

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

Tôi chắc chắn rằng các cổng của mình được chuyển tiếp 100%, Windows Firewall bị tắt. Không có gì chặn cổng 9999. Điều gì khác có thể xảy ra?

+0

Trạng thái javadoc của trạng thái 'BindException': Các tín hiệu xảy ra khi cố gắng liên kết ổ cắm với địa chỉ và cổng cục bộ. Thông thường, cổng đang được sử dụng hoặc không thể chỉ định địa chỉ cục bộ được yêu cầu. Bạn có chắc chắn bạn không có chương trình của bạn chạy hai lần, trong đó trường hợp đầu tiên sử dụng cổng và trường hợp thứ hai ném ngoại lệ vì cổng đã được sử dụng bởi cá thể đầu tiên – Robin

+0

Âm thanh giống như một bản sao khác của máy chủ của bạn đang chạy (kiểm tra tác vụ kiểm tra kép) hoặc bạn vừa mới giết một phiên bản khác của máy chủ và ổ cắm bị "kéo dài" trong một thời gian. –

+4

Xem http://nirlevy.blogspot.co.il/2007/12/tomcat-javanetbindexception-cannot.html "Không thể chỉ định địa chỉ được yêu cầu" có nghĩa là (trong trường hợp của bạn) có thể là "localhost" không ánh xạ tới một địa chỉ hợp lệ ip. –

Trả lời

13

Như những người khác đã chỉ ra, có nhiều khả năng là liên quan đến quá trình khác sử dụng cổng 9999. Trên Windows, hãy chạy lệnh:

netstat -a -n | grep "LIST" 

Và danh sách nên liệt kê bất kỳ điều gì đang treo cổng. Tất nhiên bạn sẽ phải đi và tự tay giết những chương trình đó trong Task Manager. Nếu điều này vẫn không hoạt động, thay thế dòng:

serverSocket = new ServerSocket(9999); 

Với:

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

Dĩ nhiên thay 192.168.1.20 với địa chỉ IP thực của bạn, hoặc sử dụng 127.0.0.1.

+4

Cảm ơn bạn đã anwsers, nhưng trước khi gửi bài tôi đã đảm bảo rằng không có gì chặn cổng 9999. Sau khi khởi động lại máy tính của tôi có lỗi tương tự. –

+0

Có. Mọi thứ tôi chạy đều tự động nhận được đặc quyền nâng cao. –

+0

Có, dòng lệnh đang chạy với quyền quản trị viên. Tôi đang sử dụng "java -jar SocketServer.jar" lệnh. –

0

Cổng được thực hiện bởi một quy trình khác. Có thể là một chương trình cũ của bạn. Đảm bảo chương trình của bạn đã thoát sạch hoặc xóa chương trình.

+0

Không thể! Tôi vừa mới khởi động lại máy tính của mình, nó không giúp được gì. –

+1

Điều này không đúng. Nếu cổng đã được thực hiện bởi một quá trình khác lỗi sẽ là "java.net.BindException: Địa chỉ đã được sử dụng". Lỗi "java.net.BindException: Không thể chỉ định địa chỉ được yêu cầu" là do bạn đã cố mở một ổ cắm trên địa chỉ IP không hợp lệ. –

0

Khi trạng thái lỗi, nó không thể liên kết - điều này thường có nghĩa là nó đang được sử dụng bởi một quy trình khác. Từ một dòng lệnh chạy:

netstat -a -n -o

Hỏi cặn kẽ đầu ra cho cổng 9999 được sử dụng ở cột bên trái.

Để biết thêm thông tin: http://www.zdnetasia.com/see-what-process-is-using-a-tcp-port-62047950.htm

+0

Khi trạng thái lỗi, địa chỉ không có sẵn, có nghĩa là các cổng hoàn toàn không liên quan. – Olathe

+2

Điều này không đúng. Nếu cổng đã được thực hiện bởi một quá trình khác lỗi sẽ là "java.net.BindException: Địa chỉ đã được sử dụng". Lỗi "java.net.BindException: Không thể chỉ định địa chỉ được yêu cầu" là do bạn đã cố mở một ổ cắm trên địa chỉ IP không hợp lệ. –

25

Nó có thể liên quan đến một sai trong /etc/hosts của bạn. Trong trường hợp của tôi, nó là như thế này: 192.168.1.11 localhost thay vì 127.0.0.1 localhost

11

Chỉ cần cho những người khác có thể nhìn vào câu trả lời này với hy vọng giải quyết một vấn đề tương tự, tôi nhận được tin nhắn tương tự bởi vì địa chỉ ip của tôi thay đổi.

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) 
+0

cũng giống như tôi. ipadress đã được thay đổi. –

+1

cảm ơn bạn, tôi đã cố gắng tìm ra điều này trong nhiều năm mà tôi không đọc. – shieldstroy

+1

cho tôi vấn đề là địa chỉ IP trước đó vẫn còn trong etc/hosts – gce

3

Đối với tôi đó là vì một sự thay đổi jmeter.properties trước vẫn chơi

httpclient.localaddress=12.34.56.78 
11

Lỗi nói Cannot assign requested address trong. Điều này có nghĩa là bạn cần sử dụng địa chỉ chính xác cho một trong các giao diện mạng của mình hoặc 0.0.0.0 để chấp nhận các kết nối từ tất cả các giao diện.

Các giải pháp khác về cổng chỉ hoạt động sau khi đôi khi thất bại ma thuật đen (như làm việc sau khi khởi động lại máy tính nhưng không phải người khác) vì cổng hoàn toàn không liên quan.

+0

thì tôi nên thay đổi nó ở đâu. Tôi đang sử dụng jboss – Saif

-3

java.net.BindException: không thể gán yêu cầu địa chỉ

Theo BindException tài liệu, nó về cơ bản:

tín hiệu rằng một lỗi xảy ra khi cố gắng để ràng buộc một socket để một địa chỉ cục bộ và cảng. Thông thường, cổng đang được sử dụng hoặc không thể chỉ định địa chỉ cục bộ được yêu cầu.

Vì vậy, thử lệnh sau:

sudo lsof -i:8983 

để kiểm tra lại nếu bất kỳ ứng dụng đang sử dụng cùng một cổng và giết nó.

Nếu không phải như vậy, hãy đảm bảo rằng địa chỉ IP của bạn mà bạn đang cố ràng buộc là chính xác (địa chỉ này được gán chính xác cho giao diện mạng của bạn).

+1

Điều này không chính xác. Nếu cổng đã được thực hiện bởi một quá trình khác lỗi sẽ là "java.net.BindException: Địa chỉ đã được sử dụng". Lỗi "java.net.BindException: Không thể chỉ định địa chỉ được yêu cầu" là do bạn đã cố mở một ổ cắm trên địa chỉ IP không hợp lệ. –

+0

@ dan.mwasuser2321368 Cảm ơn bạn đã đề xuất, tôi đã cải thiện câu trả lời của mình, vui lòng kiểm tra chỉnh sửa của tôi. – kenorb

3

tài liệu Java cho java.net.BindExcpetion,

tín hiệu rằng một lỗi xảy ra khi cố gắng để ràng buộc một ổ cắm đến một địa chỉ địa phương và cổng. Thông thường, cổng đang được sử dụng hoặc yêu cầu địa chỉ cục bộ không thể được chỉ định.

Nguyên nhân:

Lỗi này là do điều kiện thứ hai nêu trên. Khi bạn khởi động một máy chủ (Tomcat, Jetty, vv) nó lắng nghe một cổng và kết nối một socket với một địa chỉ và cổng. Trong Windows và Linux tên máy chủ được giải quyết thành địa chỉ IP từ /etc/hosts Máy chủ lưu trữ tệp ánh xạ địa chỉ IP này có thể được tìm thấy tại C:\Windows\System32\Drivers\etc\hosts. Nếu ánh xạ này được thay đổi và tên máy chủ không thể được giải quyết thành địa chỉ IP bạn nhận được thông báo lỗi.

Giải pháp:

Chỉnh sửa tệp máy chủ và sửa ánh xạ cho tên máy chủ và IP bằng đặc quyền quản trị viên.

ví dụ:

#127.0.0.1 localhost 
192.168.52.1 localhost 

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

+0

Đây là một lỗi khác so với câu hỏi. –

+0

Câu hỏi là về một thông báo lỗi "Không thể gán địa chỉ được yêu cầu". Thông báo lỗi đó KHÔNG giống như thông báo lỗi mà câu trả lời của bạn minh họa hoặc giải quyết. –

+0

Đây phải là câu trả lời được chấp nhận. 'Không thể gán lỗi địa chỉ được yêu cầu' là do hệ điều hành không thể giải quyết 'localhost', được yêu cầu để khởi động và tắt máy chủ. Điều này thường xảy ra nhất do tệp máy chủ được cấu hình sai. Lỗi này KHÔNG đặc biệt do cổng đang được sử dụng. Tôi nhận xét tất cả các mục ngoại trừ '127.0.0.1 localhost' này từ tệp/etc/hosts của tôi để giải quyết vấn đề tương tự với ứng dụng tomcat của tôi. – Rishi

0

Trong trường hợp của tôi, xóa từ/etc/hosts

  • 127.0.0.1 localhost
  • 192.168.100.20 localhost < < < < ---- (xóa hoặc nhận xét)
0

Tôi đã gặp lỗi này khi sao chép cấu hình từ máy chủ này sang máy chủ khác.

Tôi có tên máy chủ của máy chủ cũ trong thuộc tính $ {JETTY_BASE} /start.ini jetty.host của mình. Đặt giá trị thuộc tính jetty.host chính xác đã giải quyết được vấn đề cho tôi.

Hy vọng điều này sẽ giúp ai đó trong tương lai, những người phải làm việc trên nhiều máy chủ cùng một lúc.

0

nếu bạn đã xảy ra trên CentOS?

Bạn nên thử điều này.

mạng $ dịch vụ khởi động lại

hoặc

khởi động lại máy chủ của bạn.

1

nếu bạn đang sử dụng máy chủ, có "IP mạng công cộng" và "IP mạng nội bộ". Sử dụng "IP mạng nội bộ" trong tệp/etc/hosts và "IP mạng công khai" trong mã của bạn. nếu bạn sử dụng "IP mạng công khai" trong tệp/etc/hosts thì bạn sẽ gặp phải lỗi này.

+0

Cảm ơn người đàn ông, tôi đã phải đối mặt với vấn đề này và gợi ý của bạn đã cứu tôi! – user2858970

Các vấn đề liên quan