使用UDP的服务器 - 客户端

时间:2016-02-10 20:31:40

标签: java sockets networking udp

我是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);





}

}

1 个答案:

答案 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.
);