我正在尝试使用 JavaOsc,但在建立连接时遇到困难。我的测试代码如下,但无论我输入什么IP地址端口,它似乎都已连接(这是不正确的)并且我没有收到任何响应。所以我做错了,但发现很难找到文档。
final static private int port = 10023;
final static private String ipAddess = "192.168.1.78";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
OSCPortOut sender = null;
OSCPortIn receiver = null;
try {
//receiver = new OSCPortIn(10023);
OSCMessageListener msgListener = new OSCMessageListener() {
@Override
public void acceptMessage(OSCMessageEvent oscMessageEvent) {
System.out.println("Message received A! " + oscMessageEvent.toString());
}
};
OSCPacketListener listener = new OSCPacketListener() {
@Override
public void handlePacket(OSCPacketEvent oscPacketEvent) {
System.out.println("Package received A! " + oscPacketEvent.toString());
}
@Override
public void handleBadData(OSCBadDataEvent oscBadDataEvent) {
System.out.println("Package BAD received B!");
}
public void acceptMessage(java.util.Date time, OSCMessage message) {
System.out.println("Message received!");
}
};
MessageSelector selector = new MessageSelector() {
@Override
public boolean isInfoRequired() {
System.out.println("Info required call");
return false;
}
@Override
public boolean matches(OSCMessageEvent oscMessageEvent) {
System.out.println("Message match?? " + oscMessageEvent.toString());
return false;
}
};
receiver = new OSCPortInBuilder().addPacketListener(listener).addMessageListener(selector, msgListener).setLocalPort(port).setRemotePort(port).build();
receiver.connect();
receiver.startListening();
sender = new OSCPortOut(InetAddress.getByName(ipAddess), port);
sender.connect();
System.out.println("Remote address: " + sender.getRemoteAddress() + " local: " + sender.getLocalAddress());
List<String> vars = new ArrayList<String>();
vars.add("/info");
OSCMessage msg = new OSCMessage("/msgAddress", vars);
System.out.println("Is connected: " + sender.isConnected());
sender.send(msg);
System.out.println("Msg info: " + msg.getInfo() + " - " + msg.getAddress());
System.out.println("Deamon: " + receiver.isDaemonListener() + " is listening " + receiver.isListening() + " is connected " + receiver.isConnected());
System.out.println("Please type 'q' to stop.");
if(scanner.nextLine().equalsIgnoreCase("q")) break;
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace(System.out);
} finally {
try {
if (sender != null) sender.close();
if (receiver != null) receiver.close();
} catch (IOException e){
System.out.println("Problem closing: " + e.getMessage());
}
}
}
System.out.println("Finished.");
回复是:
Info required
Remote address: /192.168.1.78:10023 local: /0.0.0.0:0
Is connected: true
Msg info: null - /msgAddress
Deamon: true is listening true is connected true
Please type 'q' to stop.
我还尝试联系本地接收器(使用 127.0.0.1),但也没有成功。 任何建议将不胜感激!
我在 Windows PC 上使用 JavaOSC 连接到 Behringer X32,并且能够建立双向通信。 我没有在其他操作系统上进行过测试,因此您的情况可能会有所不同。
X32 在用于发送到 X32 的同一端口上响应客户端。 这给 JavaOSC 带来了一个问题,因为默认情况下它会动态分配一个端口用于发送和接收(不同的端口)。
技巧是告诉 JavaOSC 使用客户端上的相同端口进行发送和接收。 为此,您需要使用 OSCPortInBuilder 和 OSCPortOutBuilder 类,并为两者配置相同的套接字作为本地套接字。
以下内容对我有用(为简洁起见,删除了 try-catch 块):
// X32 listens on this port
int x32Port = 10023;
// Port for sending AND receiving packets on the client
// This needs to be manually assigned
int clientPort = myClientPort;
InetSocketAddress clientSocket = new InetSocketAddress(clientPort);
InetSocketAddress x32Socket = new InetSocketAddress(x32IP, x32Port);
// build the receiver socket and connect
var recvBuilder = new OSCPortInBuilder();
recvBuilder.setRemoteSocketAddress(x32Socket);
recvBuilder.setLocalSocketAddress(clientSocket);
recvBuilder.setNetworkProtocol(NetworkProtocol.UDP);
OSCPortIn receiver = recvBuilder.build();
receiver.connect();
// build the sender socket -- note that the local socket address
// is that same as the receiver's
var sendBuilder = new OSCPortOutBuilder();
sendBuilder.setLocalSocketAddress(clientSocket);
sendBuilder.setRemoteSocketAddress(x32Socket);
sendBuilder.setNetworkProtocol(NetworkProtocol.UDP);
OSCPortOut sender = sendBuilder.build();
sender.connect();
正如评论所建议的,像 Wireshark 这样的工具可以帮助您调试网络问题。