最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java NIO無法綁定指定IP和端口解決方案

 更新時間:2020年10月20日 15:47:00   作者:cuisuqiang  
這篇文章主要介紹了Java NIO無法綁定指定IP和端口解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在使用SNMP4J時,我想指定創(chuàng)建的客戶端使用的本地IP和端口,因為在Socket時這是可以的,但是發(fā)現(xiàn)無法實現(xiàn)

因為SNMP4J底層的通信是使用NIO實現(xiàn)的,而NIO編程時貌似就不能顯示的指定

例如在SNMP4J的DefaultTcpTransportMapping類里面,當作為客戶端需要發(fā)送消息時,程序首先判斷是否創(chuàng)建了這個客戶端,如果沒有在創(chuàng)建時看到這樣的代碼:

SocketChannel sc = null;
try {
	sc = SocketChannel.open();
	sc.configureBlocking(false);
	sc.connect(new InetSocketAddress(((TcpAddress) address).getInetAddress(),((TcpAddress) address).getPort()));
	s = sc.socket();
	entry = new SocketEntry((TcpAddress) address, s);
	entry.addMessage(message);
	sockets.put(address, entry);
	synchronized (pending) {
		pending.add(entry);
	}
	selector.wakeup();
	logger.debug("Trying to connect to " + address);
} catch (IOException iox) {
	logger.error(iox);
	throw iox;
}

即使在SocketChannel中,他的Socket變量定義也是不能修改的:

/**
 * Retrieves a socket associated with this channel.
 *
 * <p> The returned object will not declare any public methods that are not
 * declared in the {@link java.net.Socket} class. </p>
 *
 * @return A socket associated with this channel
 */
public abstract Socket socket();

所以我直接判定Java NIO中,客戶端是無法指定自己的IP和端口的!

那么有人在想為什么需要指定自己的IP和端口?具體需求我就不再說了,在計算機上雖然只有一塊網(wǎng)卡,但是我們可以使用兼容的IP:

由于我的服務端程序以客戶端IP來判斷信息來源,現(xiàn)在我需要在我的電腦上做測試程序,需要同時邦定兩個IP地址進行消息發(fā)送。

此時我就可以在高級設置里面設置兼容IP就可以,但是現(xiàn)在程序卻無法選擇。

在Socket里面可以這樣寫:

package com.xidian.nms.socket;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class SocketServer {
	public static void main(String[] args) throws Exception {
		// 創(chuàng)建非邦定式連接對象
		ServerSocket ss = new ServerSocket();
		// 需要邦定的本地IP和地址
		SocketAddress address = new InetSocketAddress("192.168.0.109", 2330);
		// 將連接對象邦定到地址
		ss.bind(address);
		System.out.println("服務已經(jīng)啟動");
		while (true) {
			// 接收請求
			Socket socketClient = ss.accept();
			// 客戶端IP
			String ip = socketClient.getInetAddress().getHostAddress();
			// 客戶端端口
			int port = socketClient.getPort();
			System.out.println("服務端收到請求:" + ip + "/" + port);
		}
	}
}

服務端很簡單,你可以一行代碼搞定,也可以顯示的指定IP、端口,然后進行顯示的服務連接操作:

package com.xidian.nms.socket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
public class SocketClient {
	public static void main(String[] args) throws Exception{
		Socket socket = new Socket();
		// 需要邦定的本地IP
		InetAddress iaddThis = InetAddress.getByName("192.168.1.109");
		// 需要邦定的本地地址
		SocketAddress saddThis = new InetSocketAddress(iaddThis,2331);
		socket.bind(saddThis);
		// 連接的遠程服務地址
		InetAddress iaddRe = InetAddress.getByName("192.168.0.109");
		SocketAddress saddRe = new InetSocketAddress(iaddRe,2330);
		// 顯示連接
		socket.connect(saddRe);
//		Socket socket = new Socket("192.168.0.109", 2330);
	}
}

注釋掉的內(nèi)容是一行搞定連接的方式。

經(jīng)過測試,如果想要修改所邦定的IP和顯示再次進行連接操作,需要把設置NIO同步的代碼放到后面:

try {
	sc = SocketChannel.open();
	s = sc.socket();
	s.bind(new InetSocketAddress("192.168.0.109", 999));
	s.connect(new InetSocketAddress(((TcpAddress) address).getInetAddress(),((TcpAddress) address).getPort()));
	sc.configureBlocking(false);
	entry = new SocketEntry((TcpAddress) address, s);
	entry.addMessage(message);
	sockets.put(address, entry);
	synchronized (pending) {
		pending.add(entry);
	}
	selector.wakeup();
	logger.debug("Trying to connect to " + address);
} catch (IOException iox) {
	logger.error(iox);
	throw iox;
}

否則會報錯:

Exception in thread "main" java.nio.channels.IllegalBlockingModeException
at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:76)
at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:65)
at org.snmp4j.transport.DefaultTcpTransportMapping$ServerThread.sendMessage(DefaultTcpTransportMapping.java:503)
at org.snmp4j.transport.DefaultTcpTransportMapping.sendMessage(DefaultTcpTransportMapping.java:183)
at org.snmp4j.MessageDispatcherImpl.sendMessage(MessageDispatcherImpl.java:214)
at org.snmp4j.MessageDispatcherImpl.sendPdu(MessageDispatcherImpl.java:475)
at org.snmp4j.Snmp.sendMessage(Snmp.java:1110)
at org.snmp4j.Snmp.send(Snmp.java:914)
at org.snmp4j.Snmp.send(Snmp.java:894)
at org.snmp4j.Snmp.send(Snmp.java:859)
at com.xidian.nms.snmp.Snmp4jGet.sendPDU(Snmp4jGet.java:59)
at com.xidian.nms.snmp.Snmp4jGet.main(Snmp4jGet.java:38)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java線程中的notifyAll喚醒操作(推薦)

    Java線程中的notifyAll喚醒操作(推薦)

    這篇文章主要介紹了Java線程中的notifyAll喚醒操作,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • java Lambda表達式的使用心得

    java Lambda表達式的使用心得

    這篇文章主要介紹了java Lambda表達式的使用心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 如何用好Java枚舉讓你的工作效率飛起來

    如何用好Java枚舉讓你的工作效率飛起來

    在JDK1.5之前沒有枚舉類型,那時候一般用接口常量來替代,而使用Java枚舉類型enum可以更貼近地表示這種常量,下面這篇文章主要給大家介紹了關于如何用好Java枚舉讓你的工作效率飛起來的相關資料,需要的朋友可以參考下
    2021-09-09
  • Java并發(fā)編程包中atomic的實現(xiàn)原理示例詳解

    Java并發(fā)編程包中atomic的實現(xiàn)原理示例詳解

    這篇文章主要給大家介紹了關于Java并發(fā)編程包中atomic的實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Java利用套接字實現(xiàn)應用程序對數(shù)據(jù)庫的訪問

    Java利用套接字實現(xiàn)應用程序對數(shù)據(jù)庫的訪問

    所謂套接字(Socket),就是對網(wǎng)絡中不同主機上的應用進程之間進行雙向通信的端點的抽象。這篇文章主要介紹了Java利用套接字實現(xiàn)應用程序對數(shù)據(jù)庫的訪問,感興趣的可以了解一下
    2022-09-09
  • 深入解析Java類加載的案例與實戰(zhàn)教程

    深入解析Java類加載的案例與實戰(zhàn)教程

    本篇文章主要介紹Tomcat類加載器架構,以及基于類加載和字節(jié)碼相關知識,去分析動態(tài)代理的原理,對Java類加載相關知識感興趣的朋友一起看看吧
    2022-05-05
  • Java Collections類操作集合詳解

    Java Collections類操作集合詳解

    這篇文章主要介紹了Java Collections類操作集合詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 簡述springboot及springboot cloud環(huán)境搭建

    簡述springboot及springboot cloud環(huán)境搭建

    這篇文章主要介紹了簡述springboot及springboot cloud環(huán)境搭建的方法,包括spring boot 基礎應用環(huán)境搭建,需要的朋友可以參考下
    2017-07-07
  • SpringBoot項目中自定義Banner的技術指南

    SpringBoot項目中自定義Banner的技術指南

    在 Spring Boot 項目中,當應用啟動時會顯示默認的 Spring 標志和版本信息,定制化的啟動 Banner 不僅可以美化應用,甚至可以提供一些關鍵信息,本文將介紹如何在 Spring Boot 項目中自定義啟動 Banner,需要的朋友可以參考下
    2025-03-03
  • Java遺傳算法之沖出迷宮

    Java遺傳算法之沖出迷宮

    這篇文章首先詳細介紹了什么是遺傳算法,然后通過遺傳算法的思想用實例解析使用遺傳算法解決迷宮問題,需要的朋友可以參考下
    2017-09-09

最新評論

岳阳市| 白朗县| 澄城县| 青岛市| 临安市| 治多县| 烟台市| 辽中县| 库尔勒市| 秦安县| 精河县| 石首市| 龙州县| 平乐县| 钦州市| 常山县| 铁岭市| 正定县| 油尖旺区| 于都县| 南昌市| 托克逊县| 彰化市| 隆回县| 招远市| 大洼县| 兴仁县| 洞口县| 长岭县| 湛江市| 交口县| 文昌市| 娄烦县| 宜都市| 石河子市| 松阳县| 郯城县| 石渠县| 江西省| 泾源县| 黄浦区|