我的问题很简单。 我想知道如何修复端口客户端。
根据Eclipse文档和IBM的说法,用户必须修复代理地址(这是绝对自然的)。但是没有提到如何修复客户端站点端口的方法。 https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.javadoc.doc/WMQMQxrClasses/com/ibm/micro/client/mqttv3/MqttClient.html
MQTT也必须在TCP Layer上,所以我认为可以修复端口。
如果您有想法,请告诉我。 感谢
答案 0 :(得分:0)
您没有指定客户端的端口,因为它是由操作系统选择的,就像任何客户端到服务器的连接一样,就像你没有&#39 ; t需要使用HTTP连接。
您在tcp://<address>:<port>
表单中传递的URL中指定MQTT代理的IP地址和端口,例如tcp://localhost:4922
。
下面的代码显示了我如何在OSGi上下文中连接Paho客户端,其中所有连接参数都是从bundle上下文中检索的。
private void configureMqtt(BundleContext context) throws IOException, MqttException {
String broker = context.getProperty("mqtt.broker");
if (broker == null) {
throw new ServiceException("Define mqtt.broker");
}
String client = context.getProperty("mqtt.clientname");
if (client == null) {
throw new ServiceException("Define mqtt.clientname");
}
String dir = context.getProperty("mqtt.persistence");
if (dir == null) {
dir = "mqtt";
};
File directory = context.getDataFile(dir);
directory.mkdirs();
logger.config(() -> String.format("MQTT broker: %s, clientname: %s persistence: %s", broker, client, directory.getAbsolutePath()));
connectOptions = new MqttConnectOptions();
connectOptions.setWill(GARAGE + "/door", new byte[0], 0, true);
String ka = context.getProperty("mqtt.keepalive");
if (ka != null) {
connectOptions.setKeepAliveInterval(Integer.valueOf(ka));
}
persistence = new MqttDefaultFilePersistence(directory.getCanonicalPath());
mqttClient = new MqttAsyncClient(broker, client, persistence);
mqttClient.setCallback(this);
connect();
}
private void connect() {
logger.fine("Connecting to MQTT broker");
try {
IMqttToken token = mqttClient.connect(connectOptions);
IMqttActionListener listener = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
logger.log(Level.INFO, "Connected to MQTT broker");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
logger.log(Level.WARNING, "Could not connect to MQTT broker, retrying in 3 seconds", exception);
service.schedule(this::connect, 3, TimeUnit.SECONDS);
}
};
token.setActionCallback(listener);
} catch (MqttException e) {
logger.log(Level.SEVERE, "Cannot reconnect to MQTT broker, giving up", e);
}
}
答案 1 :(得分:0)
在正常情况下,您没有为TCP连接设置源端口,只需让操作系统选择一个随机空闲端口。
如果您修复了源端口,那么您只能在给定计算机上一次运行1个客户端实例,如果连接失败,则必须等待TCP堆栈再次释放该套接字。可以重新连接。
如果由于某种原因你真的需要来修复源端口,那么你可能会编写一个自定义javax.net.SocketFactory实现,你可以对源端口进行硬编码。然后将其作为MQTTConnectOptions对象的一部分传递进去,但我再次努力想出一个理由这是一个好主意。