當前位置:首頁 » 幣種行情 » javaeth0

javaeth0

發布時間: 2023-01-26 10:26:44

⑴ 安卓7.1系統能驅動外置乙太網口嗎

有USB轉RJ45的 USB網卡,
測試完畢,沒有問題。

1,請准備一個USB轉RJ45的 USB外置網卡
2,手機或安卓平板大多都是MINI USB線,你的設備如果也是MINI USB線,你還需要一個MINI USB轉USB標准口的轉接線
3,安卓系統的版本需要4.0以上

以下測試圖片是使用的三星蓋世樂 SM-705 大屏。
【還使用了魅族手機和華為手機測試均已經通過,但未保留截圖。截圖提供三星蓋世樂T705】

【1】這個就是 USB轉RJ45 的外置網卡,一端是USB介面,一端是RJ45介面,是100M外置網卡。

⑵ java web項目獲取客戶端ip

public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

⑶ java如何獲得當前的網路傳輸速度

1. JAVA還沒有API可以做到。2. 可以通過腳本等到主機的網路流量:windown使用wmi,linux使用命令(watch -n 1 "/sbin/ifconfig eth0 | grep bytes")。3. 另外就是SNMP協議,通過對於的MID獲得主機或者網路設備的流量。java有個開源的實現叫做SNMP4J,你可以google 「SNMP4J 網路流量」搜索到大量信息。(使用SNMP輪詢做實事流量監控的頻率不要太高,否則會有負載問題。)

⑷ java 怎麼調用linux nload命令

截圖在Runtime.getRuntime().exec("寫入dos命令");

⑸ java里測試添加的命令語句是什麼

ava性能調試命令
java性能調試命令_性能測試--十個命令迅速發現性能問題

投機啟示錄
原創
關注
0點贊·85人閱讀
十個命令迅速發現性能問題

uptime

dmesg | tail

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

free -m

sar -n DEV 1

sar -n TCP,ETCP 1

top

1. uptime

$ uptime

23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02

這是一種用來快速查看系統平均負載的方法,它表明了系統中有多少要運行的任務(進程)。在 Linux 系統中,這些數字包含了需要在 CPU 中運行的進程以及正在等待 I/O(通常是磁碟 I/O)的進程。它僅僅是對系統負載的一個粗略展示,稍微看下即可。你還需要其他工具來進一步了解具體情況。

這三個數字展示的是一分鍾、五分鍾和十五分鍾內系統的負載總量平均值按照指數比例壓縮得到的結果。從中我們可以看到系統的負載是如何隨時間變化的。比方你在檢查一個問題,然後看到 1 分鍾對應的值遠小於 15 分鍾的值,那麼可能說明這個問題已經過去了,你沒能及時觀察到。

在上面這個例子中,系統負載在隨著時間增加,因為最近一分鍾的負載值超過了 30,而 15 分鍾的平均負載則只有 19。這樣顯著的差距包含了很多含義,比方 CPU 負載。若要進一步確認的話,則要運行 vmstat 或 mpstat 命令。

2. dmesg | tail

$ dmesg | tail

[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0

[...]

[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child

[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB

[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.

這條命令顯式了最近的 10 條系統消息,如果它們存在的話。查找能夠導致性能問題的錯誤。上面的例子包含了 oom-killer,以及 TCP 丟棄一個請求。

千萬不要錯過這一步!dmesg 命令永遠值得一試

3. vmstat 1

$ vmstat 1

procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0

32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0

32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0

32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0

32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0

vmstat(8) 是虛擬內存統計的簡稱,其是一個常用工具(幾十年前為了 BSD 所創建)。其在每行列印一條關鍵的伺服器的統計摘要。

vmstat 命令指定一個參數 1 運行,來列印每一秒的統計摘要。(這個版本的 vmstat)輸出的第一行的那些列,顯式的是開機以來的平均值,而不是前一秒的值。現在,我們跳過第一行,除非你想要了解並記住每一列。

檢查這些列:

r:CPU 中正在運行和等待運行的進程的數量。其提供了一個比平均負載更好的信號來確定 CPU 是否飽和,因為其不包含 I/O。解釋:「r」的值大於了 CPU 的數量就表示已經飽和了。

free:以 kb 為單位顯式的空閑內存。如果數字位數很多,說明你有足夠的空閑內存。「free -m」 命令,是下面的第七個命令,其可以更好的說明空閑內存的狀態。

si, so:Swap-ins 和 swap-outs。如果它們不是零,則代表你的內存不足了。

us, sy, id, wa, st:這些都是平均了所有 CPU 的 CPU 分解時間。它們分別是用戶時間(user)、系統時間(內核)(system)、空閑(idle)、等待 I/O(wait)、以及佔用時間(stolen)(被其他訪客,或使用 Xen,訪客自己獨立的驅動域)。

CPU 分解時間將會通過用戶時間加系統時間確認 CPU 是否為忙碌狀態。等待 I/O 的時間一直不變則表明了一個磁碟瓶頸;這就是 CPU 的閑置,因為任務都阻塞在等待掛起磁碟 I/O 上了。你可以把等待 I/O 當成是 CPU 閑置的另一種形式,其給出了為什麼 CPU 閑置的一個線索。

對於 I/O 處理來說,系統時間是很重要的。一個高於 20% 的平均系統時間,可以值得進一步的探討:也許內核在處理 I/O 時效率太低了。

在上面的例子中,CPU 時間幾乎完全花在了用戶級,表明應用程序佔用了太多 CPU 時間。而 CPU 的平均使用率也在 90% 以上。這不一定是一個問題;檢查一下「r」列中的飽和度。

4. mpstat -P ALL 1

$ mpstat -P ALL 1

Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78

07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99

07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00

07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00

07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03

[...]

這個命令列印每個 CPU 的 CPU 分解時間,其可用於對一個不均衡的使用情況進行檢查。一個單獨 CPU 很忙碌則代表了正在運行一個單線程的應用程序。

5. pidstat 1

$ pidstat 1

Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

07:41:02 PM UID PID %usr %system %guest %CPU CPU Command

07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0

07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave

07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java

07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java

07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java

07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat

07:41:03 PM UID PID %usr %system %guest %CPU CPU Command

07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave

07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java

07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java

07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass

07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat

pidstat 命令有點像 top 命令對每個進程的統計摘要,但循環列印一個滾動的統計摘要來代替 top 的刷屏。其可用於實時查看,同時也可將你所看到的東西(復制粘貼)到你的調查記錄中。

上面的例子表明兩個 Java 進程正在消耗 CPU。%CPU 這列是所有 CPU 合計的;1591% 表示這個 Java 進程消耗了將近 16 個 CPU。

6. iostat -xz 1

$ iostat -xz 1

Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

73.96 0.00 3.73 0.03 0.06 22.21

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util

xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09

xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25

xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26

dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04

dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00

dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03

[...]

這是用於查看塊設備(磁碟)情況的一個很棒的工具,無論是對工作負載還是性能表現來說。查看個列:

r/s, w/s, rkB/s, wkB/s:這些分別代表該設備每秒的讀次數、寫次數、讀取 kb 數,和寫入 kb 數。這些用於描述工作負載。性能問題可能僅僅是由於施加了過大的負載。

await:以毫秒為單位的 I/O 平均消耗時間。這是應用程序消耗的實際時間,因為它包括了排隊時間和處理時間。比預期更大的平均時間可能意味著設備的飽和,或設備出了問題。

avgqu-sz:向設備發出的請求的平均數量。值大於 1 說明已經飽和了(雖說設備可以並行處理請求,尤其是由多個磁碟組成的虛擬設備。)

%util:設備利用率。這個值是一個顯示出該設備在工作時每秒處於忙碌狀態的百分比。若值大於 60%,通常表明性能不佳(可以從 await 中看出),雖然它取決於設備本身。值接近 100% 通常意味著已飽和。

如果該存儲設備是一個面向很多後端磁碟的邏輯磁碟設備,則 100% 利用率可能只是意味著當前正在處理某些 I/O 佔用,然而,後端磁碟可能遠未飽和,並且可能能夠處理更多的工作。

請記住,磁碟 I/O 性能較差不一定是程序的問題。許多技術通常是非同步 I/O,使應用程序不會被阻塞並遭受延遲(例如,預讀,以及寫緩沖)。

7. free -m

$ free -m

total used free shared buffers cached

Mem: 245998 24545 221453 83 59 541

-/+ buffers/cache: 23944 222053

Swap: 0 0 0

右邊的兩列顯式:

buffers:用於塊設備 I/O 的緩沖區緩存。

cached:用於文件系統的頁面緩存。

我們只是想要檢查這些不接近零的大小,其可能會導致更高磁碟 I/O(使用 iostat 確認),和更糟糕的性能。上面的例子看起來還不錯,每一列均有很多 M 個大小。

比起第一行,-/+ buffers/cache 提供的內存使用量會更加准確些。Linux 會把暫時用不上的內存用作緩存,一旦應用需要的時候就立刻重新分配給它。所以部分被用作緩存的內存其實也算是空閑的內存。為了解釋這一點, 甚至有人專門建了個網站: linuxatemyram。

如果你在 Linux 上安裝了 ZFS,這一點會變得更加困惑,因為 ZFS 它自己的文件系統緩存不算入free -m。有時候發現系統已經沒有多少空閑內存可用了,其實內存卻都待在 ZFS 的緩存里。

8. sar -n DEV 1

$ sar -n DEV 1

Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil

12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00

12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00

12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil

12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00

12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00

12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

這個工具可以被用來檢查網路介面的吞吐量:rxkB/s 和 txkB/s,以及是否達到限額。上面的例子中,eth0 接收的流量達到 22Mbytes/s,也即 176Mbits/sec(限額是 1Gbit/sec)

我們用的版本中還提供了 %ifutil 作為設備使用率(接收和發送的最大值)的指標。我們也可以用 Brendan 的 nicstat 工具計量這個值。一如 nicstat,sar 顯示的這個值是很難精確取得的,在這個例子裡面,它就沒在正常的工作(0.00)。

9. sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1

Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)

12:17:19 AM active/s passive/s iseg/s oseg/s

12:17:20 AM 1.00 0.00 10233.00 18846.00

12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s

12:17:20 AM 0.00 0.00 0.00 0.00 0.00

12:17:20 AM active/s passive/s iseg/s oseg/s

12:17:21 AM 1.00 0.00 8359.00 6039.00

12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s

12:17:21 AM 0.00 0.00 0.00 0.00 0.00

這是一些關鍵的 TCP 指標的匯總視圖。這些包括:

active/s:每秒本地發起 TCP 連接數(例如,通過 connect())。

passive/s:每秒遠程發起的 TCP 連接數(例如,通過 accept())。

retrans/s:每秒重傳 TCP 次數。

active 和 passive 的連接數往往對於描述一個粗略衡量伺服器負載是非常有用的:新接受的連接數(passive),下行連接數(active)。可以理解為 active 連接是對外的,而 passive 連接是對內的,雖然嚴格來說並不完全正確(例如,一個 localhost 到 localhost 的連接)。

重傳是出現一個網路和伺服器問題的一個徵兆。其可能是由於一個不可靠的網路(例如,公網)造成的,或許也有可能是由於伺服器過載並丟包。上面的例子顯示了每秒只有一個新的 TCP 連接。

10. top

$ top

top - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92

Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie

%Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers

KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java

4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave

66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top

5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java

4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java

1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init

2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd

3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0

5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H

6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0

8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched

top 命令包含了很多我們之前已經檢查過的指標。可以方便的執行它來查看相比於之前的命令輸出的結果有很大不同,這表明負載是可變的。

top 的一個缺點是,很難看到數據隨時間變動的趨勢。vmstat 和 pidstat 提供的滾動輸出會更清楚一些。如果你不以足夠快的速度暫停輸出(Ctrl-S 暫停,Ctrl-Q 繼續),一些間歇性問題的線索也可能由於被清屏而丟失。

⑹ 用java語言怎麼修改linux下eth0網卡的ip地址,請高手指點下,最好有例子....

vi /etc/sysconfig/network-scripts/ifcfg-eth0

點擊i 成插入狀態
添加
IPADDR=ccc.ccc.vvv.bbb
按下esc
輸入:wq 回車結束(冒號也是要輸入的)
需要重啟服務才能設置成剛才的ip
命令 為
service network restart

那個我也是做java的
我到現在都沒聽過java可以改ip的
我只聽過有偵測IP啊 獲取ip。。這些
至於修改ip 我真沒聽過
你見過.net可以修改自己機子的ip的嘛。
我也沒見過

⑺ java如何查詢本機ip地址和mac地址

Java中可以使用程序來獲取本地ip地址和mac地址,使用InetAddress這個工具類,示例如下:

importjava.net.*;
publicclassNetInfo{
publicstaticvoidmain(String[]args){
newNetInfo().say();
}
publicvoidsay(){
try{
InetAddressi=InetAddress.getLocalHost();
System.out.println(i);//計算機名稱和IP
System.out.println(i.getHostName());//名稱
System.out.println(i.getHostAddress());//只獲得IP
}
catch(Exceptione){e.printStackTrace();}
}
}

也可以通過命令行窗口來查看本地ip和mac地址,輸入命令:ipconfig。

⑻ java web 開發如何控制使用期限及綁定伺服器mac

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;

/**
* 與系統相關的一些常用工具方法.
*
* @author lvbogun
* @version 1.0.0
*/
public class SystemTool {

/**
* 獲取當前操作系統名稱. return 操作系統名稱 例如:windows xp,linux 等.
*/
public static String getOSName() {
return System.getProperty("os.name").toLowerCase();
}

/**
* 獲取unix網卡的mac地址. 非windows的系統默認調用本方法獲取.
* 如果有特殊系統請繼續擴充新的取mac地址方法.
*
* @return mac地址
*/
public static String getUnixMACAddress() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// linux下的命令,一般取eth0作為本地主網卡
process = Runtime.getRuntime().exec("ifconfig eth0");
// 顯示信息中包含有mac地址信息
bufferedReader = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
// 尋找標示字元串[hwaddr]
index = line.toLowerCase().indexOf("hwaddr");
if (index >= 0) {// 找到了
// 取出mac地址並去除2邊空格
mac = line.substring(index + "hwaddr".length() + 1).trim();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
bufferedReader = null;
process = null;
}
return mac;
}

/**
* 獲取widnows網卡的mac地址.
*
* @return mac地址
*/
public static String getWindowsMACAddress() {
String mac = null;
BufferedReader bufferedReader = null;
Process process = null;
try {
// windows下的命令,顯示信息中包含有mac地址信息
process = Runtime.getRuntime().exec("ipconfig /all");
bufferedReader = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = null;
int index = -1;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
// 尋找標示字元串[physical
index = line.toLowerCase().indexOf("physical address");

if (index >= 0) {// 找到了
index = line.indexOf(":");// 尋找":"的位置
if (index >= 0) {
System.out.println(mac);
// 取出mac地址並去除2邊空格
mac = line.substring(index + 1).trim();
}
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
bufferedReader = null;
process = null;
}

return mac;
}

/**
* windows 7 專用 獲取MAC地址
*
* @return
* @throws Exception
*/
public static String getMACAddress() throws Exception {

// 獲取本地IP對象
InetAddress ia = InetAddress.getLocalHost();
// 獲得網路介面對象(即網卡),並得到mac地址,mac地址存在於一個byte數組中。
byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();

// 下面代碼是把mac地址拼裝成String
StringBuffer sb = new StringBuffer();

for (int i = 0; i < mac.length; i++) {
if (i != 0) {
sb.append("-");
}
// mac[i] & 0xFF 是為了把byte轉化為正整數
String s = Integer.toHexString(mac[i] & 0xFF);
sb.append(s.length() == 1 ? 0 + s : s);
}

// 把字元串所有小寫字母改為大寫成為正規的mac地址並返回
return sb.toString().toUpperCase();
}
}

寫一個全局攔截的servlet,只要有請求的時候就調用這個類裡面的獲取mac地址的方法

String os = getOSName();
System.out.println(os);
if (os.equals("windows 7")) {
String mac = getMACAddress();
System.out.println(mac);
} else if (os.startsWith("windows")) {
// 本地是windows
String mac = getWindowsMACAddress();
System.out.println(mac);
} else {
// 本地是非windows系統 一般就是unix
String mac = getUnixMACAddress();
System.out.println(mac);
}

記得判斷一下是什麼系統

⑼ 使用Java 測試網路連通性的幾種方法

概述在網路編程中,有時我們需要判斷兩台機器之間的連通性,或者說是一台機器到另一台機器的網路可達性。在系統層面的測試中,我們常常用 Ping 命令來做驗證。盡管 Java 提供了比較豐富的網路編程類庫(包括在應用層的基於 URL 的網路資源讀取,基於 TCP/IP 層的 Socket 編程,以及一些輔助的類庫),但是沒有直接提供類似 Ping 命令來測試網路連通性的方法。本文將介紹如何通過 Java 已有的 API,編程實現各種場景下兩台機器之間的網路可達性判斷。在下面的章節中,我們會使用 Java 網路編程的一些類庫 java.net.InetAddress 和 java.net.Socket,通過例子解釋如何模擬 Ping 命令。回頁首簡單判斷兩台機器的可達性一般情況下,我們僅僅需要判斷從一台機器是否可以訪問(Ping)到另一台機器,此時,可以簡單的使用 Java 類庫中 java.net.InetAddress 類來實現,這個類提供了兩個方法探測遠程機器是否可達 �0�2boolean isReachable(int�0�2timeout) //�0�2測試地址是否可達�0�2boolean isReachable(NetworkInterface�0�2netif, int�0�2ttl, int�0�2timeout) //�0�2測試地址是否可達. 簡單說來,上述方法就是通過遠端機器的 IP 地址構造 InetAddress 對象,然後調用其 isReachable 方法,測試調用機器和遠端機器的網路可達性。注意到遠端機器可能有多個 IP 地址,因而可能要迭代的測試所有的情況。清單1:簡單判斷兩台機器的可達性 void isAddressAvailable(String ip){ try{ InetAddress address = InetAddress.getByName(ip);//ping this IP if(address instanceof java.net.Inet4Address){ System.out.println(ip + " is ipv4 address"); }else if(address instanceof java.net.Inet6Address){ System.out.println(ip + " is ipv6 address"); }else{ System.out.println(ip + " is unrecongized"); } if(address.isReachable(5000)){ System.out.println("SUCCESS - ping " + IP + " with no interface specified"); }else{ System.out.println("FAILURE - ping " + IP + " with no interface specified"); } System.out.println("
-------Trying different interfaces--------
"); Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); System.out.println( "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName()); if(address.isReachable(ni, 0, 5000)){ System.out.println("SUCCESS - ping " + ip); }else{ System.out.println("FAILURE - ping " + ip); } Enumeration<InetAddress> ips = ni.getInetAddresses(); while(ips.hasMoreElements()) { System.out.println("IP: " + ips.nextElement().getHostAddress()); } System.out.println("-------------------------------------------"); } }catch(Exception e){ System.out.println("error occurs."); e.printStackTrace(); } } 程序輸出 --------------START-------------- 10.13.20.70 is ipv4 address SUCCESS - ping 10.13.20.70 with no interface specified -------Trying different interfaces-------- Checking interface, DisplayName:MS TCP Loopback interface, Name:lo FAILURE - ping 10.13.20.70 IP: 127.0.0.1 ------------------------------------------- Checking interface, DisplayName:Intel(R) Centrino(R) Advanced-N 6200 AGN - Teefer2 Miniport, Name:eth0 FAILURE - ping 10.13.20.70 IP: 9.123.231.40 ------------------------------------------- Checking interface, DisplayName:Intel(R) 82577LM Gigabit Network Connection - Teefer2 Miniport, Name:eth1 SUCCESS - ping 10.13.20.70 ------------------------------------------- Checking interface, DisplayName:WAN (PPP/SLIP) Interface, Name:ppp0 SUCCESS - ping 10.13.20.70 IP: 10.0.50.189 ------------------------------------------- --------------END-------------- 從上可以看出 isReachable 的用法,可以不指定任何介面來判斷遠端網路的可達性,但這不能區分出數據包是從那個網路介面發出去的 ( 如果本地有多個網路介面的話 );而高級版本的 isReachable 則可以指定從本地的哪個網路介面測試,這樣可以准確的知道遠端網路可以連通本地的哪個網路介面。但是,Java 本身沒有提供任何方法來判斷本地的哪個 IP 地址可以連通遠端網路,Java 網路編程介面也沒有提供方法來訪問 ICMP 協議數據包,因而通過 ICMP 的網路不可達數據包實現這一點也是不可能的 ( 當然可以用 JNI 來實現,但就和系統平台相關了 ), 此時可以考慮本文下一節提出的方法。回頁首指定本地和遠程網路地址,判斷兩台機器之間的可達性在某些情況下,我們可能要確定本地的哪個網路地址可以連通遠程網路,以便遠程網路可以回連到本地使用某些服務或發出某些通知。一個典型的應用場景是,本地啟動了文件傳輸服務 ( 如 FTP),需要將本地的某個 IP 地址發送到遠端機器,以便遠端機器可以通過該地址下載文件;或者遠端機器提供某些服務,在某些事件發生時通知注冊了獲取這些事件的機器 ( 常見於系統管理領域 ),因而在注冊時需要提供本地的某個可達 ( 從遠端 ) 地址。雖然我們可以用 InetAddress.isReachabl 方法判斷出本地的哪個網路介面可連通遠程玩過,但是由於單個網路介面是可以配置多個 IP 地址的,因而在此並不合適。我們可以使用 Socket 建立可能的 TCP 連接,進而判斷某個本地 IP 地址是否可達遠程網路。我們使用 java.net.Socket 類中的 connect 方法 void connect(SocketAddress�0�2endpoint, int�0�2timeout) �0�2//使用Socket連接伺服器,指定超時的時間 這種方法需要遠程的某個埠,該埠可以是任何基於 TCP 協議的開放服務的埠(如一般都會開放的 ECHO 服務埠 7, Linux 的 SSH 服務埠 22 等)。實際上,建立的 TCP 連接被協議棧放置在連接隊列,進而分發到真正處理數據的各個應用服務,由於 UDP 沒有連接的過程,因而基於 UDP 的服務(如 SNMP)無法在此方法中應用。具體過程是,枚舉本地的每個網路地址,建立本地 Socket,在某個埠上嘗試連接遠程地址,如果可以連接上,則說明該本地地址可達遠程網路。程序清單 2:指定本地地址和遠程地址,判斷兩台機器之間的可達性 void printReachableIP(InetAddress remoteAddr, int port){ String retIP = null; Enumeration<NetworkInterface> netInterfaces; try{ netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); Enumeration<InetAddress> localAddrs = ni.getInetAddresses(); while(localAddrs.hasMoreElements()){ InetAddress localAddr = localAddrs.nextElement(); if(isReachable(localAddr, remoteAddr, port, 5000)){ retIP = localAddr.getHostAddress(); break; } } } } catch(SocketException e) { System.out.println( "Error occurred while listing all the local network addresses."); } if(retIP == null){ System.out.println("NULL reachable local IP is found!"); }else{ System.out.println("Reachable local IP is found, it is " + retIP); } } boolean isReachable(InetAddress localInetAddr, InetAddress remoteInetAddr, int port, int timeout) { booleanisReachable = false; Socket socket = null; try{ socket = newSocket(); // 埠號設置為 0 表示在本地挑選一個可用埠進行連接 SocketAddress localSocketAddr = new InetSocketAddress(localInetAddr, 0); socket.bind(localSocketAddr); InetSocketAddress endpointSocketAddr = new InetSocketAddress(remoteInetAddr, port); socket.connect(endpointSocketAddr, timeout); System.out.println("SUCCESS - connection established! Local: " + localInetAddr.getHostAddress() + " remote: " + remoteInetAddr.getHostAddress() + " port" + port); isReachable = true; } catch(IOException e) { System.out.println("FAILRE - CAN not connect! Local: " + localInetAddr.getHostAddress() + " remote: " + remoteInetAddr.getHostAddress() + " port" + port); } finally{ if(socket != null) { try{ socket.close(); } catch(IOException e) { System.out.println("Error occurred while closing socket.."); } } } return isReachable; } 運行結果 --------------START-------------- FAILRE - CAN not connect! Local: 127.0.0.1 remote: 10.8.1.50 port22 FAILRE - CAN not connect! Local: 9.123.231.40 remote: 10.8.1.50 port22 SUCCESS - connection established! Local: 10.0.50.189 remote: 10.8.1.50 port22 Reachable local IP is found, it is 10.0.50.189 --------------END-------------- 回頁首IPv4 和 IPv6 混合網路下編程當網路環境中存在 IPv4 和 IPv6,即機器既有 IPv4 地址,又有 IPv6 地址的時候,我們可以對程序進行一些優化,比如 由於IPv4 和 IPv6 地址之間是無法互相訪問的,因此僅需要判斷 IPv4 地址之間和 IPv6 地址之間的可達性。 對於IPv4 的換回地址可以不做判斷,對於 IPv6 的 Linklocal 地址也可以跳過測試 根據實際的需要,我們可以優先考慮選擇使用 IPv4 或者 IPv6,提高判斷的效率程序清單 3: 判斷本地地址和遠程地址是否同為 IPv4 或者 IPv6 // 判斷是 IPv4 還是 IPv6 if(!((localInetAddr instanceofInet4Address) && (remoteInetAddr instanceofInet4Address) || (localInetAddr instanceofInet6Address) && (remoteInetAddr instanceofInet6Address))){ // 本地和遠程不是同時是 IPv4 或者 IPv6,跳過這種情況,不作檢測 break; } 程序清單 4:跳過本地地址和 LinkLocal 地址 if( localAddr.isLoopbackAddress() || localAddr.isAnyLocalAddress() || localAddr.isLinkLocalAddress() ){ // 地址為本地環回地址,跳過 break; } 回頁首總結和展望本文列舉集中典型的場景,介紹了通過 Java 網路編程介面判斷機器之間可達性的幾種方式。在實際應用中,可以根據不同的需要選擇相應的方法稍加修改即可。對於更加特殊的需求,還可以考慮通過 JNI 的方法直接調用系統 API 來實現,能提供更加強大和靈活的功能,這里就不再贅述了。參考資料 學習 參考developerWorks 的文章 Java 應用程序的網路運行環境編程,獲取更多網路編程相關的信息。
如果要通過 JNI 進行網路編程,可以參考 developerWorks 上的文章 用JNI 進行 Java 編程,了解更多 JNI 相關的信息和例子。
參考Javadoc 獲取更多關於 Java 網路編程的 API 的信息。
developerWorks Java 技術專區:這里有數百篇關於 Java 編程各個方面的文章。
討論加入developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,並與其他 developerWorks 用戶交流。
作者簡介吳校軍,IBM CSTL 軟體工程師,長期從事 IBM 系統管理相關軟體的開發,目前負責 Director6.1 Update Manager 的開發。劉冠群現為 IBM 上海系統科技開發中心(CSTL)的軟體工程師,有多年的 Java 和 C++ 編程經驗,對於操作系統,網路和編程語言的內部實現有強烈興趣。關閉[x]關於報告濫用的幫助報告濫用謝謝! 此內容已經標識給管理員注意。關閉[x]關於報告濫用的幫助報告濫用報告濫用提交失敗。 請稍後重試。關閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發布的內容一同顯示。所有提交的信息確保安全。關閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發布的內容顯示在一起。昵稱長度在 3 至 31 個字元之間。 您的昵稱在 developerWorks 社區中必須是唯一的,並且出於隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字元之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。

⑽ Hadoop集群搭建:2.虛擬機克隆

克隆之前先把自帶的JDK刪除,省的後面克隆之後每個節點都要單獨刪除:

rpm -qa | grep java 查看linux系統中自帶的jkd

java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64

tzdata-java-2013g-1.el6.noarch

java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

刪除jdk

rpm -e java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64 --nodeps

rpm -e tzdata-java-2013g-1.el6.noarch --nodeps

rpm -e java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 --nodeps

--------------------------------------

先關閉master節點的虛擬機,之後克隆2份系統

需要更改的有3個地方:第一是eth0 的名稱,第二是Ip地址,第三是主機名稱

克隆無腦下一步,可以選擇完整克隆

一,修改etho 的名稱

6版本的CentOS克隆之後會多出來一個eth1,需要把eth0刪掉(master的信息),把eth1改成eth0

7版本的會自動替換,不需要這一步修改

命令:vi /etc/udev/rules.d/70-persistent-net.rules

二、修改主機名稱:vi /etc/sysconfig/network

三、修改Ip地址,UUID和物理地址,master里也可以刪掉,修改後重啟網路:service network restart,ping www..com  看看能不能ping通

四、重啟系統,使用xshell連接,之後正式進入集群搭建環節

熱點內容
幣圈三大交易所關閉幣價會降嗎 發布:2025-07-20 13:09:52 瀏覽:968
以太坊商貿是 發布:2025-07-20 12:50:04 瀏覽:412
金三萬數字貨幣 發布:2025-07-20 12:46:15 瀏覽:769
幣圈商家轉錯錢了 發布:2025-07-20 12:26:28 瀏覽:832
區塊鏈應用認證 發布:2025-07-20 12:23:06 瀏覽:542
2018幣圈罵戰名單 發布:2025-07-20 12:13:49 瀏覽:190
熊市幣圈生存法則視頻 發布:2025-07-20 12:03:50 瀏覽:101
幣圈凍卡潮怎麼防範 發布:2025-07-20 11:54:31 瀏覽:472
幣圈什麼是對敲交易 發布:2025-07-20 11:48:43 瀏覽:319
算力挖礦靠什麼掙錢 發布:2025-07-20 11:39:21 瀏覽:505