InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
isReachable
ফিরে আসে কেন false
? আমি আইপি পিন করতে পারেন
InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
isReachable
ফিরে আসে কেন false
? আমি আইপি পিন করতে পারেন
উত্তর:
"IsReachable" পদ্ধতি অনেক ক্ষেত্রে আমার জন্য ব্যবহার যোগ্য ছিল না। আপনি যদি অনলাইনে এবং বাহ্যিক হোস্টগুলি (যেমন google.com) সমাধান করতে সক্ষম হন তবে কেবলমাত্র পরীক্ষার জন্য আমার বিকল্পটি দেখতে আপনি নীচে স্ক্রোল করতে পারেন ... যা সাধারণত * এনআইএক্স মেশিনে কাজ করে বলে মনে হচ্ছে।
সমস্যাটি
এ সম্পর্কে প্রচুর বকবক রয়েছে:
এখানে অন্যান্য, অনুরূপ প্রশ্ন রয়েছে:
এমনকি এই একই বিষয়ে একটি প্রতিবেদন করা বাগ:
পর্ব 1: সমস্যার একটি পুনরুত্পাদনযোগ্য উদাহরণ
মনে রাখবেন যে এই ক্ষেত্রে, এটি ব্যর্থ।
//also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd"
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress address : addresses) {
if (address.isReachable(10000))
{
System.out.println("Connected "+ address);
}
else
{
System.out.println("Failed "+address);
}
}
//output:*Failed www.google.com/74.125.227.114*
পার্ট 2: একটি হ্যাকিশ ওয়ার্কারআউন্ড
বিকল্প হিসাবে, আপনি এটি করতে পারেন:
// in case of Linux change the 'n' to 'c'
Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);
পিং -c বিকল্পটি পিংকে কেবল একবার সার্ভারে পৌঁছানোর চেষ্টা করার অনুমতি দেয় (অসীম পিংয়ের বিপরীতে যা আমরা টার্মিনালে ব্যবহার করছি)।
হোস্টটি যদি অ্যাক্সেসযোগ্য হয় তবে এটি 0 ফিরে আসবে । অন্যথায়, আপনি ফেরতের মান হিসাবে "2" পাবেন।
অনেক সহজ - তবে অবশ্যই এটি প্ল্যাটফর্ম নির্দিষ্ট। এবং এই কমান্ডটি ব্যবহার করার ক্ষেত্রে কিছু বিশেষ অধিকার থাকতে পারে - তবে আমি এটি আমার মেশিনে কাজ করে দেখছি।
দয়া করে নোট করুন: 1) এই সমাধানটি উত্পাদন মানের নয়। এটি হ্যাক একটি বিট। যদি গুগলটি ডাউন থাকে, বা আপনার ইন্টারনেট অস্থায়ীভাবে ধীর হয়ে গেছে, অথবা আপনার সুবিধাগুলি / সিস্টেম সেটিংসে কিছু মজাদারতা থাকলেও, যদি মিথ্যা নেতিবাচকতা ফিরে আসতে পারে (যেমন এটি ইনপুট ঠিকানায় পৌঁছা যায় তবুও এটি ব্যর্থ হতে পারে)। 2) isRachable ব্যর্থতা একটি অসামান্য সমস্যা। আবার - এখানে বেশ কয়েকটি অনলাইন সংস্থান রয়েছে যা ইঙ্গিত করে যে এই লেখার সময় এটি করার কোনও "নিখুঁত" উপায় নেই, জেভিএম হোস্টগুলিতে পৌঁছানোর চেষ্টা করার কারণে - আমি অনুমান করি এটি একটি অভ্যন্তরীণ প্ল্যাটফর্ম নির্দিষ্ট কাজ যা সহজ, যদিও , এখনও জেভিএম দ্বারা যথেষ্ট বিমূর্ত করা হয়নি।
isReachable
আমি ব্যর্থ হয়ে যাচ্ছি এবং পিং ব্যবহার করে আইসিএমপি অনুমোদিত হচ্ছি না? আপনি কি এখন এটি মোকাবেলা করতে জানেন?
public boolean waitFor(long timeout, TimeUnit unit)
java.lang.Process মধ্যে (1.8 @since)
আমি এই একই প্রশ্নের উত্তর পেতে এখানে এসেছি, তবে আমি কোনও উত্তর দ্বারা অসন্তুষ্ট ছিলাম কারণ আমি একটি প্ল্যাটফর্মের স্বাধীন সমাধান খুঁজছিলাম। আমি যে কোডটি লিখেছি এবং প্ল্যাটফর্মটি স্বতন্ত্র সে কোডটি এখানে রয়েছে তবে অন্যান্য মেশিনে কোনও মুক্ত পোর্ট সম্পর্কে তথ্য প্রয়োজন (যা আমাদের বেশিরভাগ সময় থাকে)।
private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
// Any Open port on other machine
// openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
try {
try (Socket soc = new Socket()) {
soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
}
return true;
} catch (IOException ex) {
return false;
}
}
InetAddress.isReachable()
ইতিমধ্যে পোর্ট via এর মাধ্যমে যা ঘটেছিল তার সমান , বাদে পরবর্তীটি পুনরায় IOExceptions
ব্যবহারযোগ্যতার ক্ষেত্রে বিভিন্ন সম্ভাব্য মানে কী তা সম্পর্কে আরও বুদ্ধিমান ।
InetAddress.isReachable()
, মানক লাইব্রেরিতে বন্দরের যুক্তি অন্তর্ভুক্ত করার জন্য ওভারলোড করা হলে এটি দুর্দান্ত হবে । আমি ভাবছি কেন এটি অন্তর্ভুক্ত করা হয়নি?
আপনি যদি কেবল এই পদ্ধতিটি ব্যবহার করে ইন্টারনেটের সাথে সংযুক্ত আছেন কিনা তা যদি পরীক্ষা করতে চান তবে ইন্টারনেট সংযুক্ত থাকলে এটি সত্য হয়ে যায়, আপনি প্রোগ্রামের মাধ্যমে সংযোগের চেষ্টা করছেন এমন সাইটের ঠিকানা ব্যবহার করা তার পছন্দনীয়।
public static boolean isInternetReachable()
{
try {
//make a URL to a known source
URL url = new URL("http://www.google.com");
//open a connection to that source
HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
//trying to retrieve data from the source. If there
//is no connection, this line will fail
Object objData = urlConnect.getContent();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
অন্যান্য উত্তরগুলি না বলে কেবল এটি স্পষ্টভাবে উল্লেখ করছি। IsReachable () এর পিং অংশটির ইউনিক্সে রুট অ্যাক্সেস প্রয়োজন। এবং হিসাবে 4779367 সালে বেসটেস দ্বারা নির্দেশিত :
এবং আপনি যদি জিজ্ঞাসা করেন যে বাশ থেকে পিং কেন না, আসলে এটিরও প্রয়োজন। যে ls -l / বিন / পিং।
যেহেতু আমার ক্ষেত্রে রুট ব্যবহার করা কোনও বিকল্প ছিল না সমাধানটি হ'ল ফায়ারওয়ালের পোর্ট 7টিতে আমার যে আগ্রহী আগ্রহী সেই নির্দিষ্ট সার্ভারে প্রবেশের অনুমতি দেওয়া।
২০১২ সালে যখন মূল প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তখন আমি কী ছিল তা নিশ্চিত নই।
এখন যেমন রয়েছে, পিংকে মূল হিসাবে কার্যকর করা হবে। পিং এক্সিকিউটেবলের অনুমোদনের মাধ্যমে আপনি + এর পতাকা এবং মূলের অন্তর্ভুক্ত প্রক্রিয়াটি দেখতে পাবেন, যার অর্থ এটি রুট হিসাবে চলবে। পিংটি কোথায় রয়েছে সেদিকে এলএস-লিয়াত চালান এবং আপনার এটি দেখা উচিত।
সুতরাং, যদি আপনি InetAddress.getByName ("www.google.com") চালনা করেন is তবে পাঠযোগ্য (5000) মূল হিসাবে, এটি সত্য হওয়া উচিত।
আইসিএমপি (পিং দ্বারা ব্যবহৃত প্রোটোকল) ব্যবহৃত কাঁচা সকেটের জন্য আপনার যথাযথ অনুমোদন দরকার
InetAddress.getByName পিংয়ের মতো নির্ভরযোগ্য তবে প্রক্রিয়াটি সঠিকভাবে চালিত হওয়ার জন্য আপনার যথাযথ অনুমতি প্রয়োজন।
যেহেতু আপনি কম্পিউটারটি পিং করতে পারেন, তাই আপনার জাভা প্রক্রিয়াটি চেকটি সম্পাদন করার জন্য পর্যাপ্ত অধিকার সহ চালানো উচিত। সম্ভবত নিম্ন পরিসরে পোর্ট ব্যবহারের কারণে। আপনি যদি নিজের জাভা প্রোগ্রামটি sudo / superuser দিয়ে চালান তবে আমি বাজি ধরব এটি কার্যকরভাবে কাজ করে।
আমি পরামর্শ দিচ্ছি যে ইন্টারনেট সংযোগ পরীক্ষা করার একমাত্র নির্ভরযোগ্য উপায় হ'ল প্রকৃতপক্ষে কোনও ফাইল সংযোগ স্থাপন এবং ডাউনলোড করা বা এক্সিকিউটিভ () এর মাধ্যমে কোনও ওএস পিং কলের আউটপুট পার্স করা। আপনি পিংয়ের জন্য প্রস্থান কোডের উপর নির্ভর করতে পারবেন না এবং isReachable () ক্রেপ হয়।
আপনি যদি পিং কমান্ডটি সঠিকভাবে সম্পাদন করে তবে এটি 0 হিসাবে ফিরে আসায় আপনি পিং প্রস্থান কোডের উপর নির্ভর করতে পারবেন না। দুর্ভাগ্যক্রমে, পিং সঠিকভাবে সম্পাদন করে যদি এটি লক্ষ্য হোস্টে পৌঁছতে না পারে তবে আপনার বাড়ির এডিএসএল রাউটার থেকে একটি "গন্তব্য হোস্টটি না পারা যায়" gets এটি এমন এক প্রতিক্রিয়া যা সাফল্যজনক হিট হিসাবে বিবেচিত হয়, সুতরাং প্রস্থান কোড = ০. এটি যোগ করতে হবে যদিও এটি একটি উইন্ডোজ সিস্টেমে রয়েছে। * নিক্স পরীক্ষা করা হয়নি।
private boolean isReachable(int nping, int wping, String ipping) throws Exception {
int nReceived = 0;
int nLost = 0;
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("ping -n " + nping + " -w " + wping + " " + ipping);
Scanner scanner = new Scanner(process.getInputStream());
process.waitFor();
ArrayList<String> strings = new ArrayList<>();
String data = "";
//
while (scanner.hasNextLine()) {
String string = scanner.nextLine();
data = data + string + "\n";
strings.add(string);
}
if (data.contains("IP address must be specified.")
|| (data.contains("Ping request could not find host " + ipping + ".")
|| data.contains("Please check the name and try again."))) {
throw new Exception(data);
} else if (nping > strings.size()) {
throw new Exception(data);
}
int index = 2;
for (int i = index; i < nping + index; i++) {
String string = strings.get(i);
if (string.contains("Destination host unreachable.")) {
nLost++;
} else if (string.contains("Request timed out.")) {
nLost++;
} else if (string.contains("bytes") && string.contains("time") && string.contains("TTL")) {
nReceived++;
} else {
}
}
return nReceived > 0;
}
এনপিং হল আইপি (প্যাকেট) পিং করার চেষ্টা করার সংখ্যা, আপনার যদি ব্যস্ত নেটওয়ার্ক বা সিস্টেমগুলি বিজার এনপিং নম্বর চয়ন করে।
উইপিং আইপি থেকে পংয়ের জন্য অপেক্ষা করছে, আপনি
এই পদ্ধতিটি ব্যবহারের জন্য 2000 মিমি সেট করতে পারেন আপনি এটি লিখতে পারেন:
isReachable(5, 2000, "192.168.7.93");
বা এইভাবে ব্যবহার:
public static boolean exists(final String host)
{
try
{
InetAddress.getByName(host);
return true;
}
catch (final UnknownHostException exception)
{
exception.printStackTrace();
// Handler
}
return false;
}
InetAddress.isReachable
flappy হয়, এবং কখনও কখনও আমরা পিং করতে পারেন যে ঠিকানাগুলির জন্য অ্যাক্সেস অযোগ্য ফেরত।
আমি নিম্নলিখিত চেষ্টা করেছিলাম:
ping -c 1 <fqdn>
এবং পরীক্ষা করুন exit status
।
আমি চেষ্টা করেছিলাম এমন সমস্ত ক্ষেত্রে InetAddress.isReachable
কাজ করে যেখানে কাজ করে না।