Java 如何让UDP服务器响应UDP客户端数据包?

Java 如何让UDP服务器响应UDP客户端数据包?,java,sockets,io,udp,Java,Sockets,Io,Udp,我无法让服务器将数据发送回客户端。这是我的代码、输入和结果 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String[] args) throws IOException {

我无法让服务器将数据发送回客户端。这是我的代码、输入和结果

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {

    public static void main(String[] args) throws IOException {
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        int port = 1345;

        //Creates connection socket.
        DatagramSocket serverSocket = new DatagramSocket(port);

        System.out.println("Server Active");
        while(true) {
            //Receiving packet
            byte[] buffer = new byte[100];
            DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
            serverSocket.receive(receivePacket);
            String clientInput = new String(buffer);
            System.out.println("Server has Received : " + clientInput);

            //Sending packet
            byte[] data = clientInput.getBytes();
            DatagramPacket sendPack = new DatagramPacket(data, data.length, ip, port);
            serverSocket.send(sendPack);
            String serverInput = new String(data);
            System.out.println("Server has sent: " + serverInput);
        }

    }
}
~~~~~~~~~~~~~~~~~

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramSocket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;


public class UDPClient
{
    public static void main(String args[]) throws IOException
    {
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        int port = 1345;

        System.out.println("Would you like to continue?");
        while(inFromUser.readLine().equals("Yes") || inFromUser.readLine().equals("yes")) {
            System.out.println("Enter an expression to be evaluated");

            //gets userInput
            String userInput = inFromUser.readLine();
            byte[] buffer = userInput.getBytes();

            //sends packet to server
            DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, ip, port);
            clientSocket.send(sendPacket);
            System.out.println("Client has sent: " + userInput);

            //receives packet from server
            byte[] data = new byte[100];
            DatagramPacket receivePacket = new DatagramPacket(data, data.length);
            clientSocket.receive(receivePacket);
            String serverInput = new String(data);
            System.out.println("Client has received: " + serverInput);
            System.out.println("Would you like to continue?");
        }
    }
}

我不知道为什么服务器不回显到客户端?我不确定我做错了什么,也不确定这段代码的整体质量。

服务器正在向自己发送回复。当您在服务器中创建
sendPacket
时,您将为其提供
ip
端口
,但是
ip
端口
是服务器自己的ip和绑定(侦听)端口,而不是客户端的端口


由于客户端创建了其
DatagramSocket
,而未指定端口,因此系统将动态为其选择未使用的端口号。您需要使用
receivePacket.getSocketAddress()
(在服务器中)获取客户端的端口号,然后在构建
sendPacket
时使用该地址。事实上,
DatagramPacket
有一个替代构造函数,它接受缓冲区、长度和
SocketAddress
,这是构建回复数据包的理想方法。

服务器将回复发送给自己。当您在服务器中创建
sendPacket
时,您将为其提供
ip
端口
,但是
ip
端口
是服务器自己的ip和绑定(侦听)端口,而不是客户端的端口


由于客户端创建了其
DatagramSocket
,而未指定端口,因此系统将动态为其选择未使用的端口号。您需要使用
receivePacket.getSocketAddress()
(在服务器中)获取客户端的端口号,然后在构建
sendPacket
时使用该地址。事实上,
DatagramPacket
有一个替代构造函数,它接受buffer、length和
SocketAddress
,这是构建回复数据包的理想方法。

更简单的方法是将请求数据包重新用于回复。它已经有了目标地址。只需设置回复的数据和长度,然后发送。很抱歉,有没有办法让您重述这句话?我试图将您在代码中提出的想法形象化,可能是我的错误,因为我的变量标签太多similiar@silversk8terz:在服务器端,更改DatagramPacket sendPack=newdatagrampacket(data,data.length,ip,port);to
DatagramPacket-sendPack=newdatagrampacket(data,data.length,receivePacket.getSocketAddress());
或者干脆把
sendPack
全部去掉,只需使用
receivePacket.setData(data);serverSocket.send(receivePacket)
取而代之的是谢谢大家!现在我要努力完成最后一步,看看是否能完成。非常感谢大家。更简单的是重新使用请求数据包进行回复。它已经包含了目标地址。只需设置回复的数据和长度,然后发送。很抱歉,您有没有办法重申这一声明我试图将您在代码中提出的想法形象化,可能是我的错误,因为我的变量标签太多similiar@silversk8terz:在服务器端,将
datagrampack sendPack=newdatagrampacket(data,data.length,ip,port);
更改为
datagrampack sendPack=newdatagrampacket(data,data.length,receivePacket.getSocketAddress());
或者干脆把
sendPack
全部去掉,用
receivePacket.setData(data);serverSocket.send(receivePacket);
代替谢谢大家!现在我要试着完成最后一步,看看能不能完成谢谢大家