我是Java套接字编程的新手,所以请原谅我,如果我问过一些非常基本和愚蠢的东西。我使用Java套接字(UDP)创建了一个服务器 - 客户端程序。客户端每当要求引用时它与服务器通信,服务器向客户端发送报价。问题是客户端没有收到报价,尽管服务器发送它。此外,服务器继续为同一个客户端提供无限的服务。时间(我明白这可能是因为while循环)。是否有任何方式服务器每个请求为每个客户端服务一次?这是我的服务类。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Random;
public class Server {
static String quote1="Last words are for fools who did not speak enough.";
static String quote2="When I die bury me with face down so that the whole World can kiss my ass.";
static String quote3="The real enemy in a war is war itself.";
static String quote4="Whoever saves a life,save the World entire.";
static String quote5="Power is when we've every justification to kill,and we don't.";
static String[] quotes={quote1,quote2,quote3,quote4,quote5};
static byte[] sendData;
static byte[] receiveData;
public static void main(String[] args) throws NumberFormatException, IOException
{
sendData=new byte[1024];
receiveData=new byte[1024];
Random rand=new Random();
String str;
if(args.length==0)
{
System.out.println("Enter the port number in the arguements");
}
else
{DatagramSocket socket=new DatagramSocket(Integer.parseInt(args[0]));
while(true)
{
DatagramPacket packet=new DatagramPacket(receiveData, receiveData.length);
socket.receive(packet);
InetAddress ip=packet.getAddress();
str=quotes[rand.nextInt(4)];
sendData=str.getBytes();
DatagramPacket packet2=new DatagramPacket(sendData,sendData.length,ip,Integer.parseInt(args[0]));
socket.send(packet2);
System.out.println("Quote sent to client at address: "+ip);
}
}
}
}
这是我的客户端类。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Client {
static byte[] sendData;
static byte[] receiveData;
static String str="Send a quote please,Mr.Server";
public static void main(String[] args) throws IOException
{
sendData=new byte[1024];
receiveData=new byte[1024];
DatagramSocket socket=new DatagramSocket();
sendData=str.getBytes();
InetAddress address=InetAddress.getByName("localhost");
DatagramPacket packet=new DatagramPacket(sendData, sendData.length, address, 8000);
socket.send(packet);
DatagramPacket packet2=new DatagramPacket(receiveData,receiveData.length);
socket.receive(packet2);
String str=new String(packet2.getData());
System.out.println(str);
}
}
答案 0 :(得分:1)
服务器正在将响应数据包发送回服务器正在侦听的端口。数据包永远不会到达客户端,但它 到达服务器,服务器将其视为客户端请求,并响应它。
在Server.java中,更改
DatagramPacket packet2 = new DatagramPacket(
sendData,
sendData.length,
ip,
Integer.parseInt(args[0]) // change this line!
);
到
DatagramPacket packet2 = new DatagramPacket(
sendData,
sendData.length,
ip,
packet.getPort() // into this.
);