Android: Failed to open a socket



我想创建一个简单的程序,使用MQTT协议发送一个简单的消息,特别是Android中的HiveMQ库,这是我所拥有的

package com.example.mqtt;
import static java.nio.charset.StandardCharsets.UTF_8;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.hivemq.client.mqtt.MqttClient;
import com.hivemq.client.mqtt.datatypes.MqttQos;
import com.hivemq.client.mqtt.mqtt3.Mqtt3AsyncClient;
import com.hivemq.client.mqtt.mqtt3.Mqtt3BlockingClient;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
Button btn;
TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.button);
final String host = "7f182d708d6041f88d49cffa1aae6f6d.s1.eu.hivemq.cloud";
btn.setOnClickListener(view -> {
Mqtt3BlockingClient client= MqttClient.builder()
.useMqttVersion3()
.serverHost(host)
.serverPort(8883)
.sslWithDefaultConfig()
.buildBlocking();
client.connect();
client.publishWith()
.topic("test")
.qos(MqttQos.AT_MOST_ONCE)
.payload(UTF_8.encode("Hello"))
.send();
client.disconnect();
});
}
}

当我试图运行它时,我得到了异常

Failed to open a socket.

这里是完整的日志

2022-06-01 17:29:11.395 21068-21068/com.example.mqtt E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mqtt, PID: 21068
com.hivemq.client.mqtt.exceptions.ConnectionFailedException: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
at io.netty.channel.socket.nio.NioSocketChannel.newSocket(NioSocketChannel.java:71)
at io.netty.channel.socket.nio.NioSocketChannel.<init>(NioSocketChannel.java:88)
at io.netty.channel.socket.nio.NioSocketChannel.<init>(NioSocketChannel.java:81)
at com.hivemq.client.internal.netty.NettyEventLoopProvider.$r8$lambda$Vsx8-5aKZJgk81sYm310N7J4yic(Unknown Source:2)
at com.hivemq.client.internal.netty.NettyEventLoopProvider$$ExternalSyntheticLambda0.newChannel(Unknown Source:0)
at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:310)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:155)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:148)
at com.hivemq.client.internal.mqtt.handler.connect.MqttConnAckSingle.connect(MqttConnAckSingle.java:91)
at com.hivemq.client.internal.mqtt.handler.connect.MqttConnAckSingle.subscribeActual(MqttConnAckSingle.java:68)
at io.reactivex.Single.subscribe(Single.java:3666)
at io.reactivex.Single.blockingGet(Single.java:2869)
at com.hivemq.client.internal.mqtt.MqttBlockingClient.connect(MqttBlockingClient.java:99)
at com.hivemq.client.internal.mqtt.mqtt3.Mqtt3BlockingClientView.connect(Mqtt3BlockingClientView.java:77)
at com.hivemq.client.internal.mqtt.mqtt3.Mqtt3BlockingClientView.connect(Mqtt3BlockingClientView.java:70)
at com.example.mqtt.MainActivity.lambda$onCreate$0(MainActivity.java:40)
at com.example.mqtt.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:0)
at android.view.View.performClick(View.java:7509)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
at android.view.View.performClickInternal(View.java:7486)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:29254)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7886)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: java.net.SocketException: Operation not permitted
at sun.nio.ch.Net.socket0(Native Method)
at sun.nio.ch.Net.socket(Net.java:420)
at sun.nio.ch.Net.socket(Net.java:413)
at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:130)
at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:60)
at io.netty.channel.socket.nio.NioSocketChannel.newSocket(NioSocketChannel.java:69)
at io.netty.channel.socket.nio.NioSocketChannel.<init>(NioSocketChannel.java:88) 
at io.netty.channel.socket.nio.NioSocketChannel.<init>(NioSocketChannel.java:81) 
at com.hivemq.client.internal.netty.NettyEventLoopProvider.$r8$lambda$Vsx8-5aKZJgk81sYm310N7J4yic(Unknown Source:2) 
at com.hivemq.client.internal.netty.NettyEventLoopProvider$$ExternalSyntheticLambda0.newChannel(Unknown Source:0) 
at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:310) 
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:155) 
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:148) 
at com.hivemq.client.internal.mqtt.handler.connect.MqttConnAckSingle.connect(MqttConnAckSingle.java:91) 
at com.hivemq.client.internal.mqtt.handler.connect.MqttConnAckSingle.subscribeActual(MqttConnAckSingle.java:68) 
at io.reactivex.Single.subscribe(Single.java:3666) 
at io.reactivex.Single.blockingGet(Single.java:2869) 
at com.hivemq.client.internal.mqtt.MqttBlockingClient.connect(MqttBlockingClient.java:99) 
at com.hivemq.client.internal.mqtt.mqtt3.Mqtt3BlockingClientView.connect(Mqtt3BlockingClientView.java:77) 
at com.hivemq.client.internal.mqtt.mqtt3.Mqtt3BlockingClientView.connect(Mqtt3BlockingClientView.java:70) 
at com.example.mqtt.MainActivity.lambda$onCreate$0(MainActivity.java:40) 
at com.example.mqtt.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:0) 
at android.view.View.performClick(View.java:7509) 
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194) 
at android.view.View.performClickInternal(View.java:7486) 
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) 
at android.view.View$PerformClick.run(View.java:29254) 
at android.os.Handler.handleCallback(Handler.java:942) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loopOnce(Looper.java:201) 
at android.os.Looper.loop(Looper.java:288) 
at android.app.ActivityThread.main(ActivityThread.java:7886) 

有人知道我做错了什么,我怎么解决这个问题?

任何帮助都将不胜感激<3

连接到HiveMQ Cloud需要使用正确编码的usernamepassword进行简单的验证,如下所示:

//define your host, username and password
final String host = "7f182d708d6041f88d49cffa1aae6f6d.s1.eu.hivemq.cloud";
final String username = "<your-user>";
final String password = "<your-password>";
...
...
...
//connect to HiveMQ Cloud with TLS and username/pw
client.connectWith()
.simpleAuth()
.username(username)
.password(UTF_8.encode(password))
.applySimpleAuth()
.send();

最新更新