亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java NIO無法綁定指定IP和端口怎么解決

發布時間:2020-10-26 17:29:26 來源:億速云 閱讀:259 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關Java NIO無法綁定指定IP和端口怎么解決,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在使用SNMP4J時,我想指定創建的客戶端使用的本地IP和端口,因為在Socket時這是可以的,但是發現無法實現

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

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

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和端口?具體需求我就不再說了,在計算機上雖然只有一塊網卡,但是我們可以使用兼容的IP:

Java NIO無法綁定指定IP和端口怎么解決

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

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

在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 {
		// 創建非邦定式連接對象
		ServerSocket ss = new ServerSocket();
		// 需要邦定的本地IP和地址
		SocketAddress address = new InetSocketAddress("192.168.0.109", 2330);
		// 將連接對象邦定到地址
		ss.bind(address);
		System.out.println("服務已經啟動");
		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);
	}
}

注釋掉的內容是一行搞定連接的方式。

經過測試,如果想要修改所邦定的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)

以上就是Java NIO無法綁定指定IP和端口怎么解決,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇阳县| 牙克石市| 观塘区| 唐海县| 固安县| 五峰| 玉林市| 大丰市| 卓资县| 江津市| 灌云县| 长沙县| 西藏| 湖口县| 阜康市| 博湖县| 科尔| 通道| 阳江市| 龙川县| 华容县| 南澳县| 社旗县| 舒兰市| 阜平县| 丰原市| 黑水县| 南部县| 襄城县| 扶余县| 武乡县| 措美县| 平潭县| 永靖县| 建昌县| 石渠县| 友谊县| 罗江县| 丰原市| 介休市| 都昌县|