色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:2日期:2022-08-22 11:49:47

在使用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();// 客戶端IPString 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();// 需要邦定的本地IPInetAddress 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.IllegalBlockingModeExceptionat 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
相關文章:
主站蜘蛛池模板: 欧美中日韩在线 | 欧美日韩综合精品一区二区三区 | 久久国产美女免费观看精品 | 国产高中生粉嫩无套第一次 | 午夜精品免费 | 国产不卡一区二区三区免费视 | 免费看成人频视在线视频 | 一级做a爱片久久毛片 | 九九色视频在线观看 | 亚洲欧美日韩精品久久亚洲区色播 | 又粗又爽又色男女乱淫播放男女 | 欧美一级大尺度毛片 | 91精品国产免费久久久久久青草 | 久久国产精品99久久久久久牛牛 | 免费一级毛片麻豆精品 | 国产在线91精品天天更新 | 怡红院久久 | 成年人精品视频 | 国产网站在线 | 在线观看欧美亚洲日本专区 | 一色屋精品亚洲香蕉网站 | 男女性高爱潮免费的国产 | 亚洲成人偷拍 | 久久国产成人精品国产成人亚洲 | 欧美做爰性欧美 | 手机看片国产免费永久 | 国产欧美一级片 | 国产一区二区三区免费视频 | 黄色激情网站 | 欧美一级淫片免费观看 | 三级黄色网址 | 亚洲欧美精品网站在线观看 | 中文无码日韩欧免费视频 | 黄色三级三级三级免费看 | 高清在线一区二区三区亚洲综合 | 免费福利在线看黄网站 | 婷婷国产成人久久精品激情 | 亚洲精品国产精品一区二区 | 免费永久国产在线视频 | 三级网站在线免费观看 | 男人干女人逼 |