【问题标题】:How to get UDP server to respond to a UDP client packet?如何让 UDP 服务器响应 UDP 客户端数据包?
【发布时间】:2018-10-07 15:01:02
【问题描述】:

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

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?");
        }
    }
}

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

【问题讨论】:

    标签: java sockets io udp


    【解决方案1】:

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

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

    【讨论】:

    • 更简单的是重用请求包进行回复。它已经有目标地址。只需设置回复的数据和长度,然后发送即可。
    • 很抱歉,有没有办法可以重述此声明
    • @silversk8terz:在服务器端,将DatagramPacket sendPack = new DatagramPacket(data, data.length, ip, port); 更改为DatagramPacket sendPack = new DatagramPacket(data, data.length, receivePacket.getSocketAddress()); 或者,干脆完全去掉sendPack,改用receivePacket.setData(data); serverSocket.send(receivePacket);
    • 谢谢你们!这么多现在我要尝试完成这最后一步,看看我能不能完成它非常感谢你
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多