客户端 服务器 udp 套接字

2022-01-22 00:00:00 client udp java

您好,我有一个 udp 客户端服务器代码不工作,我问一个一般性问题Shane 是个好孩子吗"这两个代码都没有出现错误,但是当我运行它输出的代码时数据报包发送包 =新数据报包(sendData,sendData.length,IPAddress,9876);而不是让客户端问候服务器.流程应该是服务器初始化并等待客户端--客户端问候服务器--服务器提出问题--客户端响应问题--服务器记录是否投票并显示天气或人是否喜欢=.欢迎任何关于如何完善代码的建议听到的是服务器代码

Hi i have a udp client server code that is not working i ask a general question "Is shane a good kid"both codes have no errors that come up but when i run the code it outputs DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); instead of letting the client greet the server. The flow should be Server initializes and waits for client--client greets server -- server asks the question -- client responds to question-- server tallies the yes no votes and displays weather or not the person is like =. any advice on how to round the code out would be welcomed hear is the server code

import java.net.*;

public class VotingServer {
//private static final int yes = 0;
private static int yes2;

public static void main(String[] args, int getrep) throws Exception{
    // part 1: initialization
    DatagramSocket serverSocket = new DatagramSocket(9876);
    byte[] receiveData = new byte[1024];
    byte[] sendData = new byte[1024];
    InetAddress[] IPAddressList = new InetAddress[5];
    int[] portList = new int[5];

    // part 2: receive the greeting from clients
    for (int i=0; i<1; i++) {
        DatagramPacket receivePacket = 
            new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String greeting = new String(receivePacket.getData());
        System.out.println("From Client: " + greeting);

        IPAddressList[i] = receivePacket.getAddress();
        portList[i] = receivePacket.getPort();
    } // for (i)

    // part 3: broadcast the votiong question to all clients
    String question = "is shane a good kid 1 for yes 0 no?
";
    for (int i=0; i<5; i++) { 
        sendData = question.getBytes();
        DatagramPacket sendPacket = 
            new DatagramPacket(sendData, sendData.length);
        serverSocket.send(sendPacket);

    // part 5: receive the age of client (B)
        DatagramPacket receivePacket = 
            new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String ageStr = new String(receivePacket.getData());
        yes2 = Integer.parseInt(ageStr);

        IPAddressList[i] = receivePacket.getAddress();
        portList[i] = receivePacket.getPort();

    // part 6: compute the price (C)
    double count= 0; 
    double no = 0;

    if (yes2 >= 1 ) count = 1;
    else 
        if (yes2 <= 0 ) no = 1;

    // part 7: send the price to client
    String rep = null;
    String countStr = ""+count+"
";
    String noStr = ""+no+"
";
    if (no < count) rep = "Is a good kid";
    else 
        if (no > count) rep = "is a bad kid";
    System.out.println(" "+getrep);
    sendData = countStr.getBytes();
    sendData = noStr.getBytes();
    sendData = rep.getBytes();
    DatagramPacket sendPacket1 = 
        new DatagramPacket(sendData, sendData.length);
    serverSocket.send(sendPacket1);

} // main()

}} // UDPServer

这是客户端代码导入 java.io.;导入 java.net.;

And here is the client code import java.io.; import java.net.;

public class ClientVoting {

    public static void main(String[] args) throws Exception {
        // part 1: initialization
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IPAddress = InetAddress.getByName("localhost");
        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];



        String sentence = inFromUser.readLine();
        sendData = sentence.getBytes();
        DatagramPacket sendPacket = 
            new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket);


        // part 2: receive the question from server
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String question = new String(receivePacket.getData());
        System.out.println("From Server:" + question);

        String yes2 = inFromUser.readLine();
        sendData = yes2.getBytes();
        DatagramPacket sendPacket1 = 
            new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket1);


        // part 4: get the price from server
        receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String rep = new String(receivePacket.getData());
        System.out.println("the answer is " + rep);

        // part 4: close the socket
        clientSocket.close();

    } // main()

    } // class UDPClient

感谢 SPF

推荐答案

我在服务器端运行您的代码时遇到 NullPointException... 代码本身存在一些问题.第一个是您尝试保持客户端连接实例的数组的索引.此时,您只有一个...

I get a NullPointException running your code in the Server-side... There are a few problems in the code itself. The first one is the index of the Array that you attempt to keep the instance of the Clients connection. At this point, you have only one...

for (int i=0; i<1; i++) {
    DatagramPacket receivePacket = 
        new DatagramPacket(receiveData, receiveData.length);
    serverSocket.receive(receivePacket);
    String greeting = new String(receivePacket.getData());
    System.out.println("From Client: " + greeting);

    IPAddressList[i] = receivePacket.getAddress();
    portList[i] = receivePacket.getPort();
} // for (i)

但是,此时,当您尝试对其进行 5 次迭代时,您的代码很容易出现 NullPointException...

However, at this point, your code is prone to NullPointException as you try to iterate over it 5 times...

String question = "is shane a good kid 1 for yes 0 no?
";
for (int i=0; i<5; i++) { 
    sendData = question.getBytes();
    DatagramPacket sendPacket = 
        new DatagramPacket(sendData, sendData.length);
    serverSocket.send(sendPacket);   <<<<---- NPE prone code line... 

这是运行代码的结果...

Here's the result of running the code...

From Client: hello
Exception in thread "main" java.lang.NullPointerException: null buffer || null address
    at java.net.PlainDatagramSocketImpl.send(Native Method)
    at java.net.DatagramSocket.send(DatagramSocket.java:629)
    at com.vasoftware.sf.common.VotingServer.main(VotingServer.java:38)

查看此异常,我注意到由于您的缓冲区不会为空,因此您的地址是问题所在,因为您创建了一个新的 DatagramPacket 没有客户端连接的 IP 和端口号...您必须通过将它们发送到 DatagramPacket 实例,以便服务器知道谁是试图通信的客户端......您尝试实现的一个非常简单/基本的示例位于 http://systembash.com/content/a-simple-java-udp-server-and-udp-client/.以下是我对代码的初步修复...您的答案仍需要在缓冲区上进行一些工作,我将其留作练习...

Looking at this exception, I noticed that since your buffer would not be null, your address is the problem, since you create a new DatagramPacket without both the IP and the Port number of the client connection... You have to pass them to the DatagramPacket instance so that the server knows who is the client trying to communicate... A very simple/basic example of what you are trying to achieve is at http://systembash.com/content/a-simple-java-udp-server-and-udp-client/. Below is my initial fixing of the code... Your answers will still need some work on the buffer, which I will leave it as an exercise...

这是一个仅接受 1 个客户端的服务器的固定代码...我将把多线程的东西 + 数据处理程序留给您作为练习...

Here's a fixed code for Server that accepts only 1 client... I will leave the Multi-threaded stuff + the data handler for you as an exercise...

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;

public class VotingServer {

  //private static final int yes = 0;
    private static int yes2;

    public static void main(String[] args) throws Exception {
        // part 1: initialization
        DatagramSocket serverSocket = new DatagramSocket(9876);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        InetAddress IPAddressList;
        int portList = -1;

        // part 2: receive the greeting from clients
        System.out.println("Ready to receive connections at port " + serverSocket.getLocalPort());
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String greeting = new String(receivePacket.getData());
        System.out.println("From Client: " + greeting);

        IPAddressList = receivePacket.getAddress();
        portList= receivePacket.getPort();

        // part 3: broadcast the votiong question to all clients
        String question = "is shane a good kid 1 for yes 0 no?
";
        sendData = question.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddressList, portList);
        serverSocket.send(sendPacket);

    // part 5: receive the age of client (B)
        receiveData = new byte[1024];
        receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String ageStr = new String(receivePacket.getData());

        try {
            yes2 = Integer.parseInt(ageStr);   //<<<----- WILL NEVER GET THE VALUE... LEAVING IT AS AN EXERCISE....

        } catch (NumberFormatException nfe) {
            yes2 = 0;
        }

        receivePacket.getAddress();
        receivePacket.getPort();

        // part 6: compute the price (C)
        double count= 0; 
        double no = 0;

        if (yes2 >= 1 ) count = 1;
        else 
            if (yes2 <= 0 ) no = 1;

        // part 7: send the price to client
        // ALSO FIXING SOME CODE HERE AS WELL....
        String rep = null;
        rep = no < count ? "Is a good kid" : "is a bad kid";
        rep += " Server Count: " + count;

        sendData = rep.getBytes();
        DatagramPacket sendPacket1 = new DatagramPacket(sendData, sendData.length, IPAddressList, portList);
        serverSocket.send(sendPacket1);
    }
}

这是客户端:

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

public class ClientVoting {

    public static void main(String[] args) throws Exception {
        // part 1: initialization
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IPAddress = InetAddress.getByName("localhost");
        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];

        System.out.print("What's the question? ");
        String sentence = inFromUser.readLine();
        sendData = sentence.getBytes();
        System.out.println("Attempting to connect the server at port " + 9876);
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket);

        System.out.println("Initial greeting sent... Waiting for response...");

        // part 2: receive the question from server
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String question = new String(receivePacket.getData());
        System.out.println("From Server:" + question);

        String yes2 = inFromUser.readLine();
        sendData = yes2.getBytes();
        DatagramPacket sendPacket1 = 
            new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket1);


        // part 4: get the price from server
        receiveData = new byte[1024];
        receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String rep = new String(receivePacket.getData());
        System.out.println("the answer is " + rep);

        // part 4: close the socket
        clientSocket.close();

    } // main()
}

您必须先执行服务器,因为它会侦听端口 9876 上打开的套接字.然后,您可以使用客户端连接到服务器.

You MUST execute the server first, as it will listen to the socket open on port 9876. Then, you can connect to the server with the client.

###### Here's the output in the server-side... Just added a few details of what's going on...
Ready to receive connections at port 9876
From Client: Marcello

####### Here's the output of the client:
What's the question? Marcello
Attempting to connect the server at port 9876
Initial greeting sent... Waiting for response...
From Server:is shane a good kid 1 for yes 0 no?
the answer is is a bad kid Server Count: 0.0

由于您的要求似乎是设计一个可以处理多个客户端并计算票数的服务器,我还建议您使用服务器的多线程版本,通过使用不同的线程来处理每个客户端在自己的线程中并更新静态计数器的值(例如,while(true) 循环在此处使用 Executor 执行新的 Runnable http://java-x.blogspot.com/2006/11/java-5-executors-threadpool.html).考虑按照描述创建一个 Runnable 实例,并将服务器的代码放在 public void run() {} 方法实现中......我也将把这个作为练习留给你......

As it seems that your requirement is to design a Server that can handle multiple clients and count on the number of votes, I would also recommend you to use a Multi-threaded version of the server by using different Threads to deal with each client in its own thread and update the value of the static counter (an example is a while(true) loop executing a new Runnable with an Executor here http://java-x.blogspot.com/2006/11/java-5-executors-threadpool.html). Think about creating a Runnable instance as described, and placing the server's code in the public void run() {} method implementation... I will leave this as an exercise for you as well...

相关文章