如何解决在Android上创建UDP代理
因此,我想为Android创建一个非常简单的UDP代理。没有数据包操纵或任何操作,仅将数据包从客户端中继到服务器,反之亦然。基本上,我想用它来使游戏服务器不在本地网络中。
我一直在寻找要使用的库,但我只能找到NetCrusher,它似乎不想在Android上运行
没有一个(正在运行的)库,我一直在直接使用DatagramSockets进行调查。问题是,我似乎无法弄清楚如何路由数据。例如,当我要侦听来自客户端的数据包时,它会抛出一个错误,提示Attempt to invoke virtual method 'void java.net.DatagramSocket.receive(java.net.DatagramPacket)' on a null object reference
。或告诉我,当没有其他人在同一端口上侦听某个地址时,该地址已被使用。
仅供参考:我只具有Java的基本经验,而对UDP则几乎没有经验。
我有3节课。 “ ServerSocket”用于服务器和代理之间的通信,“ ClientSocket”用于客户端和代理之间的通信,“ Proxy”将它们粘合在一起。
ServerSocket:
public class ServerSocket implements ReceiveListener {
private List<ReceiveListener> listeners = new ArrayList<ReceiveListener>();
public void addListener(ReceiveListener toAdd) {
listeners.add(toAdd);
}
private int port;
private InetAddress dest;
private DatagramSocket socket;
public ServerSocket(String dest,Integer port){
this.port = port;
try {
this.dest = InetAddress.getByName(dest);
} catch (UnknownHostException e) {
e.printStackTrace();
}
try {
this.socket = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void send(String msg){
DatagramPacket packet = new DatagramPacket(msg.getBytes(),msg.getBytes().length,dest,port);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
private void listen() throws Exception {
System.out.println("-- Running Server at " + InetAddress.getLocalHost() + "--");
String msg;
while (true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
// blocks until a packet is received
socket.receive(packet);
msg = new String(packet.getData()).trim();
System.out.println(
"Message from " + packet.getAddress().getHostAddress() + ": " + msg);
for (ReceiveListener hl : listeners)
hl.onServerReceive(msg);
}
}
@Override
public void onClientReceive(String msg) {
send(msg);
}
@Override
public void onServerReceive(String msg) {
}
}
ClientSocket:
public class ClientSocket implements ReceiveListener {
private List<ReceiveListener> listeners = new ArrayList<ReceiveListener>();
public void addListener(ReceiveListener toAdd) {
listeners.add(toAdd);
}
private int port;
private InetAddress dest;
private DatagramSocket socket;
public ClientSocket(int port){
this.port = port;
try {
this.socket = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
try {
this.listen();
} catch (Exception e) {
e.printStackTrace();
}
}
public void send(String msg){
DatagramPacket packet = new DatagramPacket(msg.getBytes(),msg.getBytes().length);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
private void listen() throws Exception {
System.out.println("-- Running Server at " + InetAddress.getLocalHost() + "--");
String msg;
while (true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),12345);
// blocks until a packet is received
socket.receive(packet);
msg = new String(packet.getData()).trim();
System.out.println(
"Message from " + packet.getAddress().getHostAddress() + ": " + msg);
for (ReceiveListener hl : listeners)
hl.onClientReceive(msg);
}
}
@Override
public void onClientReceive(String msg) {
}
@Override
public void onServerReceive(String msg) {
send(msg);
}
}
代理:
public class Proxy {
private String dest;
private int port;
private ServerSocket serverSocket;
private ClientSocket clientSocket;
public Proxy(String dest,Integer port){
this.serverSocket = new ServerSocket("SomeUDPServer.com",12345);
this.clientSocket = new ClientSocket(12345);
this.clientSocket.addListener(serverSocket);
this.serverSocket.addListener(clientSocket);
}
}
该设置中出现的错误:
W/System.err: java.net.BindException: Address already in use
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:96)
at java.net.DatagramSocket.bind(DatagramSocket.java:390)
at java.net.DatagramSocket.<init>(DatagramSocket.java:245)
at java.net.DatagramSocket.<init>(DatagramSocket.java:298)
at java.net.DatagramSocket.<init>(DatagramSocket.java:270)
at xyz.xenorio.mixoproxy.Util.ClientSocket.<init>(ClientSocket.java:29)
at xyz.xenorio.mixoproxy.Util.Proxy.<init>(Proxy.java:15)
at xyz.xenorio.mixoproxy.Tasks.ProxyTask.doInBackground(ProxyTask.java:12)
at xyz.xenorio.mixoproxy.Tasks.ProxyTask.doInBackground(ProxyTask.java:8)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
I/System.out: -- Running Server at localhost/127.0.0.1--
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.net.DatagramSocket.receive(java.net.DatagramPacket)' on a null object reference
at xyz.xenorio.mixoproxy.Util.ClientSocket.listen(ClientSocket.java:61)
at xyz.xenorio.mixoproxy.Util.ClientSocket.<init>(ClientSocket.java:35)
at xyz.xenorio.mixoproxy.Util.Proxy.<init>(Proxy.java:15)
at xyz.xenorio.mixoproxy.Tasks.ProxyTask.doInBackground(ProxyTask.java:12)
at xyz.xenorio.mixoproxy.Tasks.ProxyTask.doInBackground(ProxyTask.java:8)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。