сокет udp клиент-сервер - PullRequest
       35

сокет udp клиент-сервер

0 голосов
/ 30 апреля 2011

Привет, у меня есть клиентский код сервера udp, который не работает. Я задаю общий вопрос: «Шейн, хороший ребенок?». Оба кода не содержат ошибок, но когда я запускаю код, он выдает DatagramPacket sendPacket = new DatagramPacket (sendData, sendData.length, IPAddress, 9876);вместо того, чтобы позволить клиенту приветствовать сервер.Поток должен быть инициализирован сервером и ждет клиента - клиент приветствует сервер - сервер задает вопрос - клиент отвечает на вопрос - сервер подсчитывает голоса «за» и «нет» и отображает погоду или нет, как человек =.любой совет о том, как округлить код, будет приветствоваться, если вы услышите код сервера

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?\n";
    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+"\n";
    String noStr = ""+no+"\n";
    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

А вот код клиента import java.io. ;импорт 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

1 Ответ

1 голос
/ 30 апреля 2011

Я получаю исключение NullPointException при запуске вашего кода на стороне сервера ... В самом коде есть несколько проблем. Первый - это индекс массива, в котором вы пытаетесь сохранить экземпляр подключения клиентов. На данный момент у вас есть только один ...

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)

Однако на данный момент ваш код склонен к NullPointException, так как вы пытаетесь повторить его 5 раз ...

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

Вот результат запуска кода ...

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/. Ниже приведено мое первоначальное исправление кода. .. Ваши ответы по-прежнему нуждаются в некоторой работе над буфером, который я оставлю в качестве упражнения ...

Вот фиксированный код для сервера, который принимает только 1 клиента ... Я оставлю для вас многопоточный материал + обработчик данных ...

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?\n";
        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. Затем вы можете подключиться к серверу с помощью клиента.

###### 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), выполняющий новый Runnable с Executor здесь http://java -x.blogspot.com / 2006/11 / java- 5-исполнители-threadpool.html ). Подумайте о создании экземпляра Runnable, как описано, и размещении кода сервера в публичной реализации метода void run () {} ... Я оставлю это и вам в качестве упражнения ...

...