Java UDP套接字类在OS X中不起作用
我上过这些课:Java UDP套接字类在OS X中不起作用,java,sockets,udp,datagram,Java,Sockets,Udp,Datagram,我上过这些课: import java.io.BufferedReader; import java.io.InputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Arrays; public class Test { public final static int DEFAULT_PORT = 9;
import java.io.BufferedReader;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
public class Test {
public final static int DEFAULT_PORT = 9;
public final static int MAX_PACKET_SIZE = 65507;
public static void main(String[] args) {
byte[] buffer = new byte[MAX_PACKET_SIZE];
try {
DatagramSocket udpSocket = new DatagramSocket(DEFAULT_PORT);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
int i = 0;
while (true) {
udpSocket.receive(packet);
System.out.println(i++ +" "+ new String(packet.getData(), 0, packet.getData().length));
DatagramPacket theOutput = new DatagramPacket(packet.getData(), packet.getData().length, packet.getAddress(), packet.getPort());
udpSocket.send(theOutput);
packet.setLength(buffer.length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
及
现在,在Windows上,如果我运行第一个类“Test”,然后运行第二个类“Test2”,那么第二个类会向第一个类发送一个数据包,然后启动一个循环,在这个循环中数据包会连续交换。
问题是,如果我在OS X上运行相同的类,第一个数据包到达类“Test”,但类“Test2”似乎没有收到响应。显然防火墙已关闭。两个类都使用su权限激发,以避免绑定权限问题。显示两个程序的输出。为什么?因为UDP不可靠,可能无法发送或接收所有数据,但您的程序中没有考虑到这一点。OP对自己的问题失去了兴趣。Test2类应输出:
0 prova 1 prova 2 prova 3 prova…等
这就是它应做的事。它实际上做什么?您需要考虑到UDP是不可靠的-您不这样做。请参阅有关UDP的教程,以了解使用UDP所需的工作。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Test2 {
public final static int DEFAULT_PORT = 10;
public final static int MAX_PACKET_SIZE = 65507;
public static void main(String[] args) {
byte[] buffer = new byte[MAX_PACKET_SIZE];
try {
DatagramSocket udpSocket = new DatagramSocket(DEFAULT_PORT);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
udpSocket.send(new DatagramPacket("prova".getBytes(), "prova".getBytes().length, InetAddress.getByName("localhost"), 9));
int i = 0;
while (true) {
udpSocket.receive(packet);
System.out.println(i++ +" "+ new String(packet.getData(), 0, packet.getData().length));
DatagramPacket theOutput = new DatagramPacket(packet.getData(), packet.getData().length, packet.getAddress(), packet.getPort());
udpSocket.send(theOutput);
packet.setLength(buffer.length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}