2011-04-29 267 views
0

嗨,我有一个udp客户端服务器代码不工作我问一个普遍的问题“Shane是一个很好的孩子”两个代码都没有出现错误,但是当我运行代码时,它输出 DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,9876);而不是让客户问候服务器。流程应该是Server初始化等客户机 - 客户机问候服务器 - 服务器问题 - 客户机回答问题 - 服务器统计是否投票和显示天气或不是人= =。 如何圆代码的任何建议将受到欢迎 听到的是服务器端的代码客户端服务器udp套接字

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 

这里是客户端代码 进口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

回答

1

我得到运行在服务器端代码中的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 

,因为它似乎是你的要求是设计一个服务器,它可以处理多个客户端和投票数算,我也建议您使用不同的线程使用的服务器的多线程版本在自己的线程中处理每个客户端并更新静态计数器的值(例如,执行新的Runnable的例子是一个while(true)循环,这里的执行器是http://java-x.blogspot.com/2006/11/java-5-executors-threadpool.html)。考虑如上所述创建一个Runnable实例,并将服务器的代码放置在public void run(){}方法实现中......我将把它作为一个练习,以供您参考......