Jika Anda tidak keberatan dengan port yang digunakan, tentukan port 0 ke konstruktor ServerSocket dan port tersebut akan mendengarkan pada port gratis apa pun.
ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());
Jika Anda ingin menggunakan satu set port tertentu, maka cara termudah mungkin untuk beralih melalui mereka sampai satu berfungsi. Sesuatu seperti ini:
public ServerSocket create(int[] ports) throws IOException {
for (int port : ports) {
try {
return new ServerSocket(port);
} catch (IOException ex) {
continue; // try next port
}
}
// if the program gets here, no port in the range was found
throw new IOException("no free port found");
}
Dapat digunakan seperti ini:
try {
ServerSocket s = create(new int[] { 3843, 4584, 4843 });
System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
System.err.println("no available ports");
}
ssh -D 127.0.0.0:0 ...
? Tidak!), Yang benar-benar membuat frustrasi. Kami harus menambal sejumlah perpustakaan / program agar dapat digunakan oleh kami.new ServerSocket(0)
tidak berbeda dalam hal ini. Tidak ada apa pun di tautan pertama Anda tentang ini. Tautan kedua Anda hanya menunjukkan praktik buruk. Setelah Anda membangunnya,ServerSocket
Anda harus menggunakannya , jangan tutup dan coba gunakan kembali nomor port yang sama. Semua itu hanya buang-buang waktu, dan juga rentan terhadap masalah pengaturan waktu.Jika Anda meneruskan 0 sebagai nomor port ke konstruktor ServerSocket, Ini akan mengalokasikan port untuk Anda.
sumber
Mulai dari Java 1.7 Anda dapat menggunakan coba-dengan-sumber daya seperti ini:
Jika Anda perlu menemukan port terbuka pada antarmuka tertentu, periksa dokumentasi ServerSocket untuk konstruktor alternatif.
Peringatan: Kode apa pun yang menggunakan nomor port yang dikembalikan oleh metode ini tunduk pada kondisi balapan - proses / utas yang berbeda dapat mengikat ke port yang sama segera setelah kami menutup instance ServerSocket.
sumber
SO_REUSEADDR
. Dan ada kondisi balapan, tetapi sulit untuk memperbaikinya.ServerSocket
dengan nomor port yang sama, karena mungkin sudah diambil sementara itu. Mengapa Anda tidak akan mengembalikan yang sebenarnyaServerSocket
alih-alih menutupnya tetap menjadi misteri.ServerSocket
alih - alihint
untuk port.Menurut Wikipedia , Anda harus menggunakan port
49152
untuk65535
jika Anda tidak memerlukan 'terkenal' pelabuhan.AFAIK satu-satunya cara untuk menentukan apakah suatu port sedang digunakan adalah dengan mencoba membukanya.
sumber
Jika Anda perlu menggunakan rentang :
sumber
ServerSockets
dalam kasus sukses, dan tidak menderita masalah jendela waktu kode ini.Jika Anda menggunakan Spring, Anda dapat mencoba http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
sumber
SpringUtils.findAvailableTcpPort()
itu melakukan persis sama yang direkomendasikan dalam jawaban lain: pilih port lalu cobanew ServerSocket(port)
.Eclipse SDK berisi SocketUtil kelas , yang melakukan apa yang Anda inginkan. Anda mungkin melihat kode sumber git .
sumber
Lihat http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
sumber
Ini berfungsi untuk saya di Java 6
sumber
Saya baru-baru ini merilis perpustakaan kecil untuk melakukan hal itu dengan tes dalam pikiran. Ketergantungan maven adalah:
Setelah diinstal, nomor port gratis dapat diperoleh melalui:
sumber
Jika server Anda mulai, maka soket itu tidak digunakan.
EDIT
Sesuatu seperti:
sumber
new ServerSocket(0)
tidak bekerja untuk Anda alternatifnya adalah ini. Saya pikir ada 85% kemungkinan Anda akhirnya menggunakan saran saya.ServerSockets
selamanya dan hanya mempertahankan yang terakhir yang berhasil. Perlu sebuahbreak
pernyataan.Jika Anda ingin membuat server sendiri menggunakan a
ServerSocket
, Anda dapat memilihnya untuk mengambil port gratis untuk Anda:Implementasi server lain biasanya memiliki dukungan serupa. Jetty misalnya memilih port gratis kecuali Anda secara eksplisit mengaturnya:
sumber
Ini mungkin tidak banyak membantu Anda, tetapi pada mesin (Ubuntu) saya, saya memiliki file / etc / services di mana setidaknya port yang digunakan / disediakan oleh beberapa aplikasi diberikan. Ini adalah port standar untuk aplikasi tersebut.
Tidak ada jaminan bahwa ini sedang berjalan, hanya port default yang digunakan aplikasi ini (jadi Anda tidak boleh menggunakannya jika memungkinkan).
Ada sedikit lebih dari 500 port yang ditentukan, sekitar setengah UDP dan setengah TCP.
File-file dibuat menggunakan informasi oleh IANA, lihat nomor port IANA Ditugaskan .
sumber
Jika Anda menggunakan Spring, jawaban yang diberikan oleh Michail Nikolaev adalah yang paling sederhana dan terbersih, dan IMO harus diunggulkan. Hanya untuk tujuan kenyamanan, saya akan menambahkan contoh sebaris menggunakan Springframwework SocketUtils .findAvailableTcpPort () metode:
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
Semudah itu, hanya satu baris :). Tentu saja, kelas Utils menawarkan banyak metode menarik lainnya, saya sarankan melihat-lihat dokumen.
sumber
Menggunakan kelas 'ServerSocket' kita dapat mengidentifikasi apakah port yang diberikan sedang digunakan atau gratis. ServerSocket menyediakan konstruktor yang mengambil integer (yang merupakan nomor port) sebagai argumen dan menginisialisasi soket server pada port. Jika ServerSocket mengeluarkan IO Exception, maka kami dapat menganggap port ini sudah digunakan.
Cuplikan berikut digunakan untuk mendapatkan semua port yang tersedia.
Tautan referensi .
sumber
jika port ditempati oleh perangkat lunak lain kode akan melempar IOException
sumber