❶ java Socket通信原理
通過tcp/IP或者udp進行網路通訊。
如果還要繼續深究的話,建議你看看網路協議方面的書籍
❷ socket5代理後如何把ip轉換成ipv6
socket5代理後只需要點擊轉換即可把ip轉換成ipv6。
拓展:
Socket 5:方形多針腳ZIF(零插拔力:只要純悄將插座上的拉桿輕輕扳起或按下,就可方便地安裝和更換)插座插座,支持奔騰P54C和P54S處理器,296/320針腳。
Socket 5是英特爾公司為Pentium Ⅱ系列CPU設計的插槽,其將Pentium Ⅱ CPU及其相關控制電路、二級緩存都做在一塊子卡上,多數Slot 1主板使用100MHz外頻。SLOT 1的技術結構比較先進,能提供更大的內部傳輸帶寬和CPU性能。採用SLOT 1介面的主板晶元組有Intel的BX、i810、i820系列及VIA的Apollo系列,ALI 的Aladdin Pro Ⅱ系列及SIS的620、630系列等。此種接仿茄口已經被淘汰,市面上已無此類介面的做大渣主板產品。
❸ 使用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("\n-------Trying different interfaces--------\n"); 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 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首
❹ 同時兼容IPv4和IPv6的Socket該怎麼寫呢 請幫忙寫一個具體的例子謝謝了
IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為「互聯網協議」。
IPv6是IETF(互聯網工程任務組,Internet Engineering Task Force)設計的用於替代現行版本IP協議(IPv4)的下一代IP協議。
目前的全球網際網路所採用的協議族是TCP/IP協議族。IP是TCP/IP協議族中網路層的協議,是TCP/IP協議族的核心協議。
目前IP協議的版本號是4(簡稱為IPv4),它的下一個版本就是IPv6。IPv6正處在不斷發展和完善的過程中,它在不久的將來將取代目前被廣泛使用的IPv4。
與IPV4相比,IPV6具有以下幾個優勢:
一,IPv6具有更大的地址空間。IPv4中規定IP地址長度為32,即有2^32-1(符號^表示升冪,下同)個地址;而IPv6中IP地址的長度為128,即有2^128-1個地址。
二,IPv6使用更小的路由表。IPv6的地址分配一開始就遵循聚類(Aggregation)的原則,這使得路由器能在路由表中用一條記錄(Entry)表示一片子網,大大減小了路由器中路由表的長度,提高了路由器轉發數據包的速度。
三,IPv6增加了增強的組播(Multicast)支持以及對流的支持(Flow Control),這使得網路上的多媒體應用有了長足發展的機會,為服務質量(QoS,Quality of Service)控制提供了良好的網路平台。
四,IPv6加入了對自動配置(Auto Configuration)的支持。這是對DHCP協議的改進和擴展,使得網路(尤其是區域網)的管理更加方便和快捷。
五,IPv6具有更高的安全性。在使用IPv6網路中用戶可以對網路層的數據進行加密並對IP報文進行校局帆驗,極大的增強了網路的安全性。
IPv6數據包:包頭
IPv6包頭長度固定為40位元組,去掉了IPv4中一切可選項,只包括8個必要的欄位,因轎灶此盡管IPv6地址長度為IPv4的四倍,IPv6包頭長度僅為IPv4包頭長度的兩倍。
其中的各個欄位分別為:
Version(版本號):4位,IP協議版本號,值= 6。
Traffice Class(通信類別):8位,指示IPv6數據流通信類別或優先順序。功能類似於IPv4的服務類型(TOS)欄位。
Flow Label(流標記):20位,IPv6新增欄位,標記需要IPv6路由器特殊處理的數據流。該欄位用於某些對連接的服務質量有特殊要求的通信,諸如音頻或視頻等實時數據傳輸。在IPv6中,同一信源和信宿之間可以有多種不同的數據流,彼此之間以非「0」流標記區分。如果不要求路由器做特殊處理,則該欄位值置為「0」。
Payload Length(負載長度):16位負載長度。負載長度包括擴展頭和上層PDU,16位最多可表示65,535位元組負載長度。超過這一位元組數的負載,該欄位值置為「0」,使用擴展頭逐個跳段(Hop-by-Hop)選項中的巨量負載(Jumbo Payload)選項。
Next Header(下一包頭):8位,識別緊跟IPv6頭後的包頭類型,如擴展頭(有的話)或某個傳輸層協議頭(諸如TCP,UDP或著ICMPv6)。
Hop Limit(跳段數限制):8位,類似於IPv4的TTL(生命期)欄位。與IPv4用時間來限定包的生命期不同,IPv6用包在路由器之間的轉發次數來限定包的生命期。包每經過一次轉發,該欄位減1,減到0時就把這個包丟棄。
Source Address(源地址):128位,發送方主機地址。
Destination Address(目的地址):128位,在大多數閉臘扮情況下,目的地址即信宿地址。但如果存在路由擴展頭的話,目的地址可能是發送方路由表中下一個路由器介面。
[編輯本段]IPv6數據包:擴展包頭
IPv6包頭設計中對原IPv4包頭所做的一項重要改進就是將所有可選欄位移出IPv6包頭,置於擴展頭中。由於除Hop-by-Hop選項擴展頭外,其他擴展頭不受中轉路由器檢查或處理,這樣就能提高路由器處理包含選項的IPv6分組的性能。
通常,一個典型的IPv6包,沒有擴展頭。僅當需要路由器或目的節點做某些特殊處理時,才由發送方添加一個或多個擴展頭。與IPv4不同,IPv6擴展頭長度任意,不受40位元組限制,以便於日後擴充新增選項,這一特徵加上選項的處理方式使得IPv6選項能得以真正的利用。 但是為了提高處理選項頭和傳輸層協議的性能,擴展頭總是8位元組長度的整數倍。
目前,RFC 2460中定義了以下6個IPv6擴展頭:Hop-by-Hop(逐個跳段)選項包頭、目的地選項包頭、路由包頭、分段包頭、認證包頭和ESP協議包頭:
(一)Hop-by-Hop選項包頭包含分組傳送過程中,每個路由器都必須檢查和處理的特殊參數選項。其中的選項描述一個分組的某些特性或用於提供填充。這些選項有:
Pad1選項(選項類型為0),填充單位元組。
PadN選項(選項類型為1),填充2個以上位元組。
Jumbo Payload選項(選項類型為194),用於傳送超大分組。使用Jumbo Payload選項,分組有效載荷長度最大可達4,294,967,295位元組。負載長度超過65,535位元組的IPv6包稱為「超大包」。
路由器警告選項(選項類型為5),提醒路由器分組內容需要做特殊處理。路由器警告選項用於組播收聽者發現和RSVP(資源預定)協議。
(二)目的地選項包頭指名需要被中間目的地或最終目的地檢查的信息。有兩種用法:
如果存在路由擴展頭,則每一個中轉路由器都要處理這些選項。
如果沒有路由擴展頭,則只有最終目的節點需要處理這些選項。
(三)路由包頭
類似於IPv4的鬆散源路由。IPv6的源節點可以利用路由擴展包頭指定一個鬆散源路由,即分組從信源到信宿需要經過的中轉路由器列表。
(四)分段包頭
提供分段和重裝服務。當分組大於鏈路最大傳輸單元(MTU)時,源節點負責對分組進行分段,並在分段擴展包頭中提供重裝信息。
(五)認證包頭
提供數據源認證、數據完整性檢查和反重播保護。認證包頭不提供數據加密服務,需要加密服務的數據包,可以結合使用ESP協議。
(六)ESP協議包頭
提供加密服務。
目前,病毒和互聯網蠕蟲是最讓人頭疼的網路攻擊行為。但這種傳播方式在IPv6的網路中就不再適用了,因為IPv6的地址空間實在是太大了,如果這些病毒或者蠕蟲還想通過掃描地址段的方式來找到有可乘之機的其他主機,就猶如大海撈針。在IPv6的世界中,對IPv6網路進行類似IPv4的按照IP地址段進行網路偵察是不可能了。
所以,在IPv6的世界裡,病毒、互聯網蠕蟲的傳播將變得非常困難。但是,基於應用層的病毒和互聯網蠕蟲是一定會存在的,電子郵件的病毒還是會繼續傳播。此外,還需要注意IPv6網路中的關鍵主機的安全。IPv6中的組發地址定義方式給攻擊者帶來了一些機會。例如,IPv6地址FF05::3是所有的DHCP伺服器,就是說,如果向這個地址發布一個IPv6報文,這個報文可以到達網路中所有的DHCP伺服器,所以可能會出現一些專門攻擊這些伺服器的拒絕服務攻擊。
以下這些網路攻擊技術,不管是在IPv4還是在IPv6的網路中都存在,需要引起高度的重視:報文偵聽,雖然IPv6提供了IPSEC最為保護報文的工具,但由於公匙和密匙的問題,在沒有配置IPsec的情況下,偷看IPv6的報文仍然是可能的;應用層的攻擊,顯而易見,任何針對應用層,如WEB伺服器,資料庫伺服器等的攻擊都將仍然有效;中間人攻擊,雖然IPv6提供了IPsec,還是有可能會遭到中間人的攻擊,所以應盡量使用正常的模式來交換密匙;洪水攻擊,不論在IPv4還是在IPv6的網路中,向被攻擊的主機發布大量的網路流量的攻擊將是會一直存在的,雖然在IPv6中,追溯攻擊的源頭要比在IPv4中容易一些。
NAT技術應該不會IPv6網路里應用的,NAT技術是IPv4地址少的情況下產生的擴大IPv4地址的技術,IPv6網路地址大大增加,沒必要用NAT
❺ java 如何從收到的socket中取得IP
java中從Socket中獲取IP地址通過Socket的getInetAddress()方法即可獲得Socket中的Ip地址。其中Socket中還可以仔培通過getLocalAddress()獲取襲明Socket綁定的拍戚告本地地址。
❻ java socket支持ipv6地址的訪問嗎
實踐證明它是健壯,易於實現,並具有很好的互操作性。但是 IPv4 協議的初始設計仍有一些未考慮到的地方,隨著 Internet 的襪羨悄飛速發展和新型應用的不斷涌現,這些不足逐漸顯露出來。首先,近年來 Internet 成指告渣數級數增長派肢,
❼ JAVA網路編程SeverSocket,Socket與accept報錯
如果你確定過這段代碼在你朋友的機器上可行,而在你的機器上面不行的話,
那可能回原因在於 Java現在答對 IPv6 的支持很不好
卸載IPv6就好了。
在本地連接的「屬性」中卸載。
希望能幫到您····
要卸載的。。。
你可以追問 別老是讓我修改答案來回答。
要是卸載不了的話 我也沒有辦法, 你運行的環境應該是win7上面虛擬的xp系統,你就從這個上面去想辦法吧,我覺得你把自己的開發環境搞得如此復雜,出現這樣的系統引起的問題是很正常的現象,我想你在選擇這種環境的時候 應該有相當的自信來面對此類問題的。
❽ java socket 如何告訴第二個客戶端及後面的socket 已經有連接了
代理伺服器解析客戶端傳入的數據,得到伺服器ip和埠,然後創建與伺服器的連接。解析代碼如下:(這里只處理了socket v5的情況,Config的常量對應java.net.SocksConsts)
try {
// socket v5
// 4byte(5 2 0 2) @see java.net.SocksSocketImpl
int len = dis.read(buffer);
// reply client
dos.write(new byte[]{Config.PROTO_VERS, Config.NO_AUTH});
dos.flush();
// read
// PROTO_VERS(1byte)
// CONNECT(1byte)
// 0(1byte)
// DOMAIN_NAME/IPV4/IPV6(1byte) DOMAIN_NAME(not consider now)
// addr(IPV4:4byte/IPV6:16byte)
// port>>8&0xff(1byte)
// port&0xff(1byte)
len = dis.read(buffer);
byte addrType = buffer[3];
byte[] applyData = null;
String serverIp = null;
int serverPort = 0;
if (addrType == Config.IPV4) {
serverIp = Util.bytes2ipv4(buffer, 4, 4);
serverPort = buffer[8] << 8 | buffer[9];
// set reply data
applyData = new byte[10];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV4;
for (int i = 4; i < 10; i++) {
// fill ip, port
applyData[i] = buffer[i];
}
} else if (addrType == Config.IPV6) {
serverIp = Util.bytes2ipv6(buffer, 4, 16);
serverPort = buffer[20] << 8 | buffer[21];
// set reply data
applyData = new byte[6];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV6;
applyData[4] = buffer[20];
applyData[5] = buffer[21];
}
// reply
dos.write(applyData);
dos.flush();
// connect the server
// serverIp是伺服器ip,serverPort是伺服器埠,用這兩個
// 創建與伺服器的socket連接
Socket socket = new Socket(serverIp, serverPort);
// 之後處理客戶端與伺服器的數據交互就用這個socket轉發就行了
// finally success!!!
} catch (Exception e) {
e.printStackTrace();
}
❾ java.net.socketException:socket accept failed
1.請卸載防火牆後重啟電腦滑粗試試。我上次是啟讓逗防火牆問題搞的,頁面進度條一直載入不完。
2.上悄賣述方法不行的話,卸載全部360軟體。
3.上述方法不行的話,我也沒有辦法了。
❿ 使用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("\n-------Trying different interfaces--------\n"); Enumeration 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 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 netInterfaces; try{ netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); Enumeration 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 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首