Java 为什么我的简单网络程序崩溃了?

Java 为什么我的简单网络程序崩溃了?,java,network-programming,udp,java-io,Java,Network Programming,Udp,Java Io,因此,我正在学习互联网上使用指南的UDP网络。我找到了一个指南,大部分是复制/粘贴的代码,它起了作用。很明显,我想自己扩张。我试图做一件简单的事情,给服务器客户端鼠标位置,然后服务器将发送回完全相同的消息给所有CAP。但由于某些原因,它可以完美地工作在0-100次之间,然后停止。这是我的密码: 服务器: public class Server implements Runnable { boolean running = false; long time; InetAd

因此,我正在学习互联网上使用指南的UDP网络。我找到了一个指南,大部分是复制/粘贴的代码,它起了作用。很明显,我想自己扩张。我试图做一件简单的事情,给服务器客户端鼠标位置,然后服务器将发送回完全相同的消息给所有CAP。但由于某些原因,它可以完美地工作在0-100次之间,然后停止。这是我的密码:

服务器:

public class Server implements Runnable {

    boolean running = false;
    long time;
    InetAddress IPAddress;
    int port;

    public static void main(String[] args) throws Exception {
        Thread th = new Thread(new Server());
        th.start();
    }

    public Server() throws Exception {
        DatagramSocket serverSocket = new DatagramSocket(9876);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];

        System.out.println("Server started");
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        IPAddress = receivePacket.getAddress();
        port = receivePacket.getPort();

        System.out.println("Client connected at " + IPAddress);
        String send = "Connected!";
        sendData = send.getBytes();

        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
        serverSocket.send(sendPacket);
        serverSocket.close();

        time = System.nanoTime();
        running = true;
    }

    public void run() {     
        int x = 0;
        while(running) {
            if(System.nanoTime() > time + 60/(1e9)) {
                time = System.nanoTime();
                try { 
                    x++;
                    DatagramSocket serverSocket = new DatagramSocket(9876);
                    byte[] receiveData = new byte[1024];
                    byte[] sendData = new byte[1024];

                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    serverSocket.receive(receivePacket);
                    System.out.println("Received message");

                    IPAddress = receivePacket.getAddress();
                    port = receivePacket.getPort();

                    String sentence = new String(receivePacket.getData());
                    System.out.println("RECEIVED " + sentence);

                    String capSentence = sentence.toUpperCase();
                    sendData = capSentence.getBytes();

                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                    serverSocket.send(sendPacket);
                    System.out.println("Sent message.");
                    System.out.println(x);
                    serverSocket.close();   
                } catch(Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
}
客户:

public class Client implements Runnable {

    boolean foundConnection = false;
    boolean running = false;        
    long time;

    public static void main(String[] args) throws Exception {
        Thread th = new Thread(new Client());
        th.start();
    }

    public Client() throws Exception {
        time = System.nanoTime();
        running = true;
    }

    public void run() {
        while(running) {
            if(System.nanoTime() > time + (60/1e9)) {
                time = System.nanoTime();

                try {
                    DatagramSocket clientSocket = new DatagramSocket();
                    InetAddress IPAddress = InetAddress.getByName("localhost");

                    byte[] sendData = new byte[1024];
                    byte[] receiveData = new byte[1024];

                    String send = "Mouse is at " + mouse();
                    sendData = send.getBytes();

                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
                    clientSocket.send(sendPacket);
                    System.out.println("Sent message.");

                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    clientSocket.receive(receivePacket);
                    System.out.println("Received message.");

                    String modSentence = new String(receivePacket.getData());
                    System.out.println("FROM SERVER: " + modSentence);
                    clientSocket.close();
                } catch(Exception e) {
                    System.out.println("Error"); 
                }
            }
        }
    }

    public static Point mouse() {
        return new Point((int)MouseInfo.getPointerInfo().getLocation().getX(), 
                (int)MouseInfo.getPointerInfo().getLocation().getY());
    }
}

可能是因为它没有正确同步,服务器在客户端到达检查消息的代码部分之前发送消息?我不知道,因为我对这真的很陌生。我想知道为什么会发生这种情况,以及如何解决它!很抱歉,代码太乱了,我不熟悉这一点,也不熟悉一般的编码。

由于不断打开和关闭服务器套接字,您很可能会遇到同步问题。这将在客户端的发送和服务器的DatagramSocket创建之间创建一个连接。如果客户机在服务器套接字初始化之前发送数据包,服务器将不会收到它,而只是永远等待它。这就是我们所知道的

要避免此问题,只需保持服务器的套接字打开即可。服务器对象初始化时打开它,服务器程序结束时关闭它。这样,客户端发送的数据报将保存在套接字缓冲区中,直到服务器调用接收为止

另一方面,服务器的构造函数和run方法有很多重复的代码。代码重复经常导致程序逻辑的不一致,从而导致错误。尽量避免复制粘贴代码