JavaOSC不多介绍,是基于UDP的Open Sound Control (OSC) 协议在Java上实现的类库。
官网介绍的用法如下:
Sender:
<span style="font-size:14px;">OSCPort sender = new OSCPort();
Object args[] = new Object[2];
args[0] = new Integer(3);
args[1] = "hello";
OSCMessage msg = new OSCMessage("/sayhello", args);
try {
sender.send(msg);
} catch (Exception e) {
showError("Couldn't send");
}</span>
Receiver:
<span style="font-size:14px;">receiver = new OSCPortIn(OSCPort.defaultSCOSCPort());
OSCListener listener = new OSCListener() {
public void acceptMessage(java.util.Date time, OSCMessage message) {
System.out.println("Message received!");
}
};
receiver.addListener("/sayhello", listener);
receiver.startListening();</span>
实际使用过程中,sender没问题,使用wireshark可以监测到PC收到的msg,但是receiver没反应,而且运行后自动终止。
就这个问题,纠结了好久,因为官方的sample就是这样。还有另外一个更详细的网站,介绍的也是这样。JavaOSC
后来查OSCPortIn的API,发现有一个run()方法:
public void run()
Run the loop that listens for OSC on a socket until isListening becomes false.
Specified by:
run in interface java.lang.Runnable
See Also:
Runnable.run()
加上之后,搞定!看来不能迷信官方的sample,也有疏漏的时候。
Server代码如下:
package com.example.OSCServer;
import java.net.SocketException;
import java.util.Date;
import java.util.List;
import com.illposed.osc.OSCListener;
import com.illposed.osc.OSCMessage;
import com.illposed.osc.OSCPortIn;
public class Server {
public static OSCPortIn receiver = null;
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
GetIpAddress getAddress = new GetIpAddress();
getAddress.run();
System.out.println("Server is running.\nThe IP address is "
+ getAddress.ipString);
try {
receiver = new OSCPortIn(Config.port);
System.out.println("Server is running.");
OSCListener listener = new OSCListener() {
@Override
public void acceptMessage(Date arg0, OSCMessage arg1) {
System.out.println("Message received!");
List<Object> args = arg1.getArguments();
System.out.println(args.get(0).toString());
}
};
receiver.addListener("/msg", listener);
receiver.startListening();
if (receiver.isListening())
System.out.println("Server is listening");
receiver.run();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("error " + e);
}
}
};
thread.start();
}
}
参考资料:
http://www.illposed.com/software/javaosc.html
http://www.illposed.com/software/javaoscdoc/
https://wush.net/trac/lsu-idt/wiki/JavaOSC