电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:8日期: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
相關文章:
主站蜘蛛池模板: RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 泡沫消防车_水罐消防车_湖北江南专用特种汽车有限公司 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 事迹材料_个人事迹名人励志故事 学生作文网_中小学生作文大全与写作指导 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 杭州顺源过滤机械有限公司官网-压滤机_板框压滤机_厢式隔膜压滤机厂家 | 泰州物流公司_泰州货运公司_泰州物流专线-东鑫物流公司 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心| 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 北京签证代办_签证办理_商务签证_旅游签证_寰球签证网 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 分类168信息网 - 分类信息网 免费发布与查询 |