下面是我的代码,它会引发错误:
java.io.EOFException: at java.io.DataInputStream.readByte(Unknown Source)
Python
或Java
使用相同的凭据和主机/端口,并且可以使用。
此代码失败:
public static void main(String args[]) throws Exception {
String host = "***********.mq.us-west-2.amazonaws.com";
Integer port = 61614; String userId="******", password="*****";
StompConnection connection = new StompConnection();
connection.open(host, port);
connection.connect(userId, password);
connection.disconnect();
}
错误:
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readByte(Unknown Source)
at org.apache.activemq.transport.stomp.StompWireFormat.readHeaderLine(StompWireFormat.java:155)
at org.apache.activemq.transport.stomp.StompWireFormat.readLine(StompWireFormat.java:148)
at org.apache.activemq.transport.stomp.StompWireFormat.parseAction(StompWireFormat.java:181)
at org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:98)
at org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:77)
at org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:68)
at org.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:139)
at org.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:132)
at org.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:122)
at com.springboot.nfl.streams.StompListn2.main(StompListn2.java:15)
这里的问题是您的脚踏客户端正在not在开始连接时正在执行所需的WebSocket handshake。
此初始握手用于将HTTP连接升级为WebSocket连接,当您直接尝试连接到主机时,将使用Java在安全的WebSocket上进行通信。请注意,您正在使用的STOMP客户端实现在发送CONNECTED
时期望CONNECT
帧,但是由于它不执行WebSocket握手,因此不会接收它,因此EOFException
。从official code example:
private StompSession connect() throws Exception {
// Create a client.
final WebSocketClient client = new StandardWebSocketClient();
final WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new StringMessageConverter());
final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
// Create headers with authentication parameters.
final StompHeaders head = new StompHeaders();
head.add(StompHeaders.LOGIN, ACTIVE_MQ_USERNAME);
head.add(StompHeaders.PASSCODE, ACTIVE_MQ_PASSWORD);
final StompSessionHandler sessionHandler = new MySessionHandler();
// Create a connection.
return stompClient.connect(<wss_endpoint>, headers, head, sessionHandler).get();
}
正如您在这里看到的,connect
包含一些headers和session handler,并且它们与WSS uri连接。您可以使用您的凭证替换标头,也可以从AWSMQTT服务器获取wss端点,有关wss uri的外观,请参见我上面共享的链接。