আমি কীভাবে জাভা ব্যবহার করে কোনও প্রদত্ত মেশিনে একটি বন্দরের উপলব্ধতা প্রোগ্রামক্রমে নির্ধারণ করতে পারি?
অর্থাত্ একটি বন্দর নম্বর দেওয়া হয়েছে, এটি ইতিমধ্যে ব্যবহৃত হচ্ছে কিনা তা নির্ধারণ করুন।
আমি কীভাবে জাভা ব্যবহার করে কোনও প্রদত্ত মেশিনে একটি বন্দরের উপলব্ধতা প্রোগ্রামক্রমে নির্ধারণ করতে পারি?
অর্থাত্ একটি বন্দর নম্বর দেওয়া হয়েছে, এটি ইতিমধ্যে ব্যবহৃত হচ্ছে কিনা তা নির্ধারণ করুন।
উত্তর:
এটি অ্যাপাচি উট প্রকল্প থেকে বাস্তবায়ন আসছে :
/**
* Checks to see if a specific port is available.
*
* @param port the port to check for availability
*/
public static boolean available(int port) {
if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
throw new IllegalArgumentException("Invalid start port: " + port);
}
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
তারা ইউটিপি এবং টিসিপিতে বন্দরটি উপলভ্য কিনা তা পরীক্ষা করতে তারা ডেটাগ্রামস্কটটিও পরীক্ষা করে দেখছেন।
আশাকরি এটা সাহায্য করবে.
ServerSocket
কোনও বন্দর শোনানো তৈরি করা হয় তবে এটি করা উচিত এবং এটিটি ফিরিয়ে দিন ServerSocket
। এটি তৈরি করে এবং তারপরে এটি বন্ধ করে এবং এটি ফিরিয়ে দেওয়া শূন্য গ্যারান্টি দেয় যে পরবর্তীতে ServerSocket
সেই বন্দরটি ব্যবহার করে তৈরি করা যেতে পারে। Ditto for DatagramSocket
।
জাভা 7 এর জন্য আপনি আরও কমপ্যাক্ট কোডের জন্য ট্রাই-উইথ রিসোর্স ব্যবহার করতে পারেন:
private static boolean available(int port) {
try (Socket ignored = new Socket("localhost", port)) {
return false;
} catch (IOException ignored) {
return true;
}
}
ConnectException: 'connection refused'
, হ্যাঁ এটি মিথ্যা ফিরে উচিত। টাইমআউটগুলির জন্য, এটি ফেরত দিতে পারে এমন কোনও কিছুই বৈধ হবে না, কারণ আসল উত্তরটি জানা যায়নি। এজন্য এই কৌশলটি এই উদ্দেশ্যে অকেজো।
এটি জাভা 7 হিসাবে দেখা যায়, ডেভিড সান্তামারিয়া এর উত্তর আর নির্ভরযোগ্যভাবে কাজ করে না। দেখে মনে হচ্ছে আপনি সংযোগটি পরীক্ষা করতে এখনও নির্ভরযোগ্যভাবে সকেট ব্যবহার করতে পারেন।
private static boolean available(int port) {
System.out.println("--------------Testing port " + port);
Socket s = null;
try {
s = new Socket("localhost", port);
// If the code makes it this far without an exception it means
// something is using the port and has responded.
System.out.println("--------------Port " + port + " is not available");
return false;
} catch (IOException e) {
System.out.println("--------------Port " + port + " is available");
return true;
} finally {
if( s != null){
try {
s.close();
} catch (IOException e) {
throw new RuntimeException("You should handle this error." , e);
}
}
}
}
আপনি যদি পারফরম্যান্স নিয়ে খুব উদ্বিগ্ন না হন তবে আপনি সর্বদা সার্ভারসকেট ক্লাস ব্যবহার করে কোনও বন্দরে শোনার চেষ্টা করতে পারেন । যদি এটি ব্যতিক্রমী প্রতিক্রিয়া ফেলে তবে এটি ব্যবহার করা হচ্ছে।
public static boolean isAvailable(int portNr) {
boolean portFree;
try (var ignored = new ServerSocket(portNr)) {
portFree = true;
} catch (IOException e) {
portFree = false;
}
return portFree;
}
সম্পাদনা: আপনি যা করার চেষ্টা করছেন সমস্ত যদি একটি মুক্ত বন্দর নির্বাচন করে থাকে তবে আপনার জন্য একটি new ServerSocket(0)
খুঁজে পাবেন।
নিম্নোক্ত সমাধানটি স্প্রিং-কোর (অ্যাপাচি লাইসেন্স) এর সকেট ইউটিলস বাস্তবায়নে অনুপ্রাণিত ।
Socket(...)
এটি ব্যবহার করে অন্যান্য সমাধানের তুলনায় বেশ দ্রুত (1000 টিসিপি পোর্ট এক সেকেন্ডেরও কম সময়ে পরীক্ষা করা):
public static boolean isTcpPortAvailable(int port) {
try (ServerSocket serverSocket = new ServerSocket()) {
// setReuseAddress(false) is required only on OSX,
// otherwise the code will not work correctly on that platform
serverSocket.setReuseAddress(false);
serverSocket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), port), 1);
return true;
} catch (Exception ex) {
return false;
}
}
সকেট ভিত্তিক সমাধানগুলি চেষ্টা করুন, সঠিক ফলাফল নাও পেতে পারে (সকেটের ঠিকানাটি "লোকালহোস্ট" এবং কিছু ক্ষেত্রে বন্দরটি "লুপব্যাক ইন্টারফেস" দ্বারা নয় "দখল করা" হতে পারে এবং উইন্ডোজে কমপক্ষে আমি দেখেছি এই পরীক্ষাটি ব্যর্থ হয়েছে অর্থাৎ প্রোটটি মিথ্যা হিসাবে উপলব্ধ হিসাবে ঘোষণা করা হয়েছে)।
সিআইসি নামে একটি দুর্দান্ত লাইব্রেরি রয়েছে , নিম্নলিখিত কোডটি আপনাকে আপ করতে পারে:
Sigar sigar = new Sigar();
int flags = NetFlags.CONN_TCP | NetFlags.CONN_SERVER | NetFlags.CONN_CLIENT; NetConnection[] netConnectionList = sigar.getNetConnectionList(flags);
for (NetConnection netConnection : netConnectionList) {
if ( netConnection.getLocalPort() == port )
return false;
}
return true;
ডেভিড সান্তামারিয়া দ্বারা চিহ্নিত উত্তরের একটি সাফাই:
/**
* Check to see if a port is available.
*
* @param port
* the port to check for availability.
*/
public static boolean isPortAvailable(int port) {
try (var ss = new ServerSocket(port); var ds = new DatagramSocket(port)) {
return true;
} catch (IOException e) {
return false;
}
}
এই এখনও একটি জাতি শর্ত ডেভিড Santamaria এর উত্তর মন্তব্যে user207421 দ্বারা নির্দিষ্ট সাপেক্ষে (কিছু পোর্ট দখল পারে পরে এই পদ্ধতি বন্ধ হয়ে যায় ServerSocket
এবং DatagramSocket
এবং আয়)।
আমার ক্ষেত্রে এটি বন্দরে সংযোগ স্থাপনে চেষ্টা করতে সহায়তা করেছে - যদি পরিষেবা ইতিমধ্যে উপস্থিত থাকে তবে এটি প্রতিক্রিয়া জানায়।
try {
log.debug("{}: Checking if port open by trying to connect as a client", portNumber);
Socket sock = new Socket("localhost", portNumber);
sock.close();
log.debug("{}: Someone responding on port - seems not open", portNumber);
return false;
} catch (Exception e) {
if (e.getMessage().contains("refused")) {
return true;
}
log.error("Troubles checking if port is open", e);
throw new RuntimeException(e);
}
আমার ক্ষেত্রে আমাকে ডেটাগ্রামসকেট ক্লাস ব্যবহার করতে হয়েছিল।
boolean isPortOccupied(int port) {
DatagramSocket sock = null;
try {
sock = new DatagramSocket(port);
sock.close();
return false;
} catch (BindException ignored) {
return true;
} catch (SocketException ex) {
System.out.println(ex);
return true;
}
}
প্রথমে আমদানি করতে ভুলবেন না
import java.net.DatagramSocket;
import java.net.BindException;
import java.net.SocketException;
আমি এর মতো কিছু চেষ্টা করেছি এবং এটি আমার সাথে সত্যই কার্যকর হয়েছিল
Socket Skt;
String host = "localhost";
int i = 8983; // port no.
try {
System.out.println("Looking for "+ i);
Skt = new Socket(host, i);
System.out.println("There is a Server on port "
+ i + " of " + host);
}
catch (UnknownHostException e) {
System.out.println("Exception occured"+ e);
}
catch (IOException e) {
System.out.println("port is not used");
}