(UDP) 服务器无法与客户端正确通信

时间:2021-06-22 12:03:37

标签: java server udp client

这些屏幕截图解释了实况中的问题: enter image description here

enter image description here

正如您在图片中看到的,客户端和服务器无法正常通信。在客户端本身发送消息之前,客户端不会从服务器接收消息。这不是我希望我的客户端和服务器通信的方式。

无论发送多少条消息,这个问题都会不断发生。

我的代码:

客户:


import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class ChatClient {
    byte[] receivedData = new byte[1024];
    DatagramSocket client;
    Scanner scanner = new Scanner(System.in);
    byte[] sentData;
    InetAddress address;

    public ChatClient() throws SocketException, UnknownHostException {
        client = new DatagramSocket();
        address = InetAddress.getByName(" PUBLIC IP IS HERE, WON'T SHOW FOR OBVIOUS REASONS");
    }

    public static void main(String[] args) throws SocketException, UnknownHostException {
        ChatClient cc = new ChatClient();

        Thread sendMessage = new Thread(() -> {
            while (true) {
                String message = cc.scanner.nextLine();
                cc.sentData = message.getBytes();

                DatagramPacket dp1 = new DatagramPacket(cc.sentData, cc.sentData.length, cc.address, 7000);
                try {
                    cc.client.send(dp1);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread receiveMessage = new Thread(() -> {
            while (true) {
                DatagramPacket dp4 = new DatagramPacket(cc.receivedData, cc.receivedData.length);
                try {
                    cc.client.receive(dp4);

                } catch (IOException e) {
                    e.printStackTrace();
                }

                String receivedMessage = new String(dp4.getData());
                System.out.println(receivedMessage);
            }
        });

        sendMessage.start();
        receiveMessage.start();
    }
}

服务器:


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatServer {
    DatagramSocket server;
    byte[] receivedData = new byte[1024];
    Scanner scanner = new Scanner(System.in);
    byte[] sentData;
    DatagramPacket dp2 = new DatagramPacket(receivedData, receivedData.length);

    public ChatServer() throws SocketException {
        server = new DatagramSocket(7000);
    }

    public static void main(String[] args) throws SocketException {
        ChatServer cs = new ChatServer();

        Thread receiveMessage = new Thread(() -> {
            while (true) {
                try {
                    cs.server.receive(cs.dp2);

                } catch (IOException e) {
                    e.printStackTrace();
                }

                String storedData = new String(cs.dp2.getData());
                System.out.println(storedData);
            }
        });

        Thread sendMessage = new Thread(() -> {
            while (true) {
                String sentMessage = cs.scanner.nextLine();
                cs.sentData = sentMessage.getBytes();

                InetAddress getIP = cs.dp2.getAddress();
                int port = cs.dp2.getPort();

                DatagramPacket dp3 = new DatagramPacket(cs.sentData, cs.sentData.length, getIP, port);
                try {
                    cs.server.send(dp3);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });


        sendMessage.start();
        receiveMessage.start();
    }
}

我很确定我知道为什么会发生这种情况,这是因为服务器在收到来自客户端的消息时获取了客户端的地址和端口。因此它只有在收到消息时才能发送。

我知道为什么会这样,但我不知道如何解决。你们有人知道我能做什么吗?

谢谢。

0 个答案:

没有答案