Я получаю исключение 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 () {} ... Я оставлю это и вам в качестве упражнения ...