我正在尝试创建代理服务器。我有一些UDP问题。我正在使用TeamSpeak 3进行测试,因为它使用UDP。到目前为止TCP协议工作正常,问题在于UDP部分。
UDPProxy.java
package com.generic.ProxyServer.ProxyServer;
import com.generic.ProxyServer.ProxyServer;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UDPProxy {
public UDPProxy(DatagramPacket receivePacket, DatagramSocket serverSocket, String host, int local, int remote) {
DatagramSocket proxySocket = null;
try {
proxySocket = new DatagramSocket();
proxySocket.setReceiveBufferSize(8192);
proxySocket.setSendBufferSize(8192);
proxySocket.setReuseAddress(true);
} catch (SocketException ex) {
Logger.getLogger(UDPProxyServer.class.getName()).log(Level.SEVERE, null, ex);
}
try {
//ip of client
InetAddress IPAddress = receivePacket.getAddress();
//port of client
int port = receivePacket.getPort();
//actual server ip
InetAddress pIPAddress = InetAddress.getByName(host);
//convert
byte[] real = new byte[receivePacket.getLength()];
System.arraycopy(receivePacket.getData(), 0, real, 0, receivePacket.getLength());
//Packet received
ProxyServer.getInstance().getLogger().log("Packet from Client: " + receivePacket.getAddress().toString() + " Port: " + receivePacket.getPort() + " To: " + local + " Data: " + new String(real));
//packet sent to actual server
DatagramPacket sendPacket = new DatagramPacket(real, real.length, pIPAddress, remote);
//send packet
proxySocket.send(sendPacket);
//log that
ProxyServer.getInstance().getLogger().log("Sent to Server: " + sendPacket.getAddress() + " Port: " + sendPacket.getPort());
//a new receive data for server response
byte[] receiveData = new byte[8192];
//servers response packet
DatagramPacket preceivePacket = new DatagramPacket(receiveData, receiveData.length);
//receive that packet from server
proxySocket.receive(preceivePacket);
//convert
byte[] preal = new byte[preceivePacket.getLength()];
System.arraycopy(preceivePacket.getData(), 0, preal, 0, preceivePacket.getLength());
//log that
ProxyServer.getInstance().getLogger().log("Response From Server: " + preceivePacket.getAddress().toString() + " Port: " + preceivePacket.getPort() + " Data: " + new String(preal));
//packet for response to send back to the client
DatagramPacket psendPacket = new DatagramPacket(preal, preal.length, IPAddress, port);
//send packet back to client
serverSocket.send(psendPacket);
ProxyServer.getInstance().getLogger().log("Response Sent To Client: " + psendPacket.getAddress().toString() + " Port: " + psendPacket.getPort());
} catch (IOException ex) {
Logger.getLogger(UDPProxyServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
UDPProxyServer.java
package com.generic.ProxyServer.ProxyServer;
import com.generic.ProxyServer.ProxyServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UDPProxyServer {
public UDPProxyServer(String host, int local, int remote) {
DatagramSocket serverSocket = null;
try {
serverSocket = new DatagramSocket(local);
serverSocket.setReceiveBufferSize(8192);
serverSocket.setSendBufferSize(8192);
serverSocket.setReuseAddress(true);
} catch (SocketException ex) {
Logger.getLogger(UDPProxyServer.class.getName()).log(Level.SEVERE, null, ex);
}
while (true) {
try {
byte[] receiveData = new byte[8192];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
UDPProxy udp=new UDPProxy(receivePacket,serverSocket,host,local,remote);
} catch (IOException ex) {
Logger.getLogger(UDPProxyServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
当我尝试连接到代理服务器时,程序中的日志显示从客户端发送的数据,服务器响应,但我无法建立与TeamSpeak 3服务器的连接。
我在这里缺少什么?
更新:我正在重用serverSocket将数据包发送到服务器。重写问题以适应变化和新问题。