Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP套接字类在OS X中不起作用_Java_Sockets_Udp_Datagram - Fatal编程技术网

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();
    }
}
}