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);toDatagramPacket-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);
代替谢谢大家!现在我要试着完成最后一步,看看能不能完成谢谢大家