2013-03-02 26 views
1

我试图让连接到我的UDP服务器的客户端发送数据包到服务器,我有一个服务器运行,因此数据包可以发送到客户端,但试图发送数据包通过客户端返回到服务器似乎造成一些奇怪的错误。多播服务器收到它发送的相同数据

如果我启动服务器,然后打开一个客户端,客户端将收到来自服务器的第一个数据包,然后客户端尝试将数据包发送到服务器,这是由服务器接收的,但随后客户端会抛出这个错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "testing" 
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) 
    at java.lang.Double.parseDouble(Unknown Source) 
    at Pong.PongUDPClient.main(PongUDPClient.java:71) 

线71将在代码 服务器控制台只是打印出应该发送给客户端的数据指出,

这里是服务器的整个代码

package Pong; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.net.Socket; 

//This is the actual server 
public class PongUDPServerThread extends Thread { 

//speed to send data 
private long dataSpeed = 10; 
private int port = 4447; 
private int idPlayer = 0; 
private PongModel model; 
private PongView view; 
private PongPlayerThread players[] = new PongPlayerThread[2]; 
private MulticastSocket socket = null; 
private InetAddress group; 
private DatagramPacket packet = null; 
private int ID = 1; 

public PongUDPServerThread() throws IOException 
{ 
    super("PongUDPServerThread"); 
} 

public String rtnInfo() 
{ 
    String str; 
    str = model.getBall().getX() + ":" + 
      model.getBall().getY() + ":" + 
      model.getBats()[0].getX() + ":" + 
      model.getBats()[0].getY() + ":" + 
      model.getBats()[1].getX() + ":" + 
      model.getBats()[1].getY(); 
    return str; 
} 

public void setupPong() throws IOException 
{ 
    System.out.println("Pong"); 
    model = new PongModel(); 
    view = new PongView(); 
      new PongController(model, view); 

    model.addObserver(view);  // Add observer to the model 

    //view.setVisible(true);   // Display Screen 
    model.makeActiveObject();  // Start play 
    //start server 
    socket = new MulticastSocket(port); 
    InetAddress group = InetAddress.getByName("230.0.0.1"); 
    socket.setReuseAddress(true); 
    socket.joinGroup(group); 
    //socket.setReuseAddress(true); 
    //Inform server user 
    System.out.println("Server is running"); 
} 

public void run() 
{ 
    //Server loop 
    while(true) 
    { 

     //Receive the data 
     try 
     { 
     byte[] receiveBuf = new byte[256]; 
     packet = new DatagramPacket(receiveBuf, receiveBuf.length); 
     socket.receive(packet); 

     String received = new String(packet.getData(), 0, packet.getLength()); 

     System.out.println(received); 
     } 
     catch (IOException e) 
     { 

     } 


     try 
     { 
      byte[] buf = new byte[256]; 

      //Gather data 
      buf = rtnInfo().getBytes(); 
      //System.out.println(buf.toString()); 

      //Send data 
      packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("230.0.0.1"), port); 
      socket.send(packet); 

      //Sleep the server 
      try 
      { 
       sleep((long)dataSpeed); 
      } 
      catch (InterruptedException e) 
      { 

      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    //socket.close(); 

} 

} 

下面是客户端代码

package Pong; 

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class PongUDPClient { 

private static int port = 4447; 

public static void main(String[] args) throws IOException 
{ 

    //Setup pong rdy 
    PongModel model = new PongModel(); 
    PongView view = new PongView(); 
         new PongController(model, view); 

    model.addObserver(view);  // Add observer to the model 

    String pos; 

    model.makeActiveObject();  // Start play 
    //model.clientModel(); 

    MulticastSocket socket = new MulticastSocket(port); 
    //socket.setReuseAddress(true); 
    InetAddress address = InetAddress.getByName("230.0.0.1"); 
    //Join the UDP list port 
    socket.setReuseAddress(true); 
    socket.joinGroup(address); 

    DatagramPacket packet; 
    view.setVisible(true);   // Display Screen 

    System.out.println("Connected"); 
    //Id is sent here. 

    while(true) 
    { 

     //Send data to server 
     try 
     { 
      byte[] receiveBuf = new byte[256]; 

      //Gather data 
      receiveBuf = "testing".getBytes(); 
      //System.out.println(buf.toString()); 

      //Send data 
      packet = new DatagramPacket(receiveBuf, receiveBuf.length, InetAddress.getByName("230.0.0.1"), port); 
      socket.send(packet); 

      //Sleep the server 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     byte[] buf = new byte[256]; 
     packet = new DatagramPacket(buf, buf.length); 
     socket.receive(packet); 

     String received = new String(packet.getData(), 0, packet.getLength()); 
     //System.out.println("Server data: " + received); 

     String[] posValues = received.split(":"); 

     model.getBall().setX(Double.parseDouble(posValues[0])); // <-- Line 71 
     model.getBall().setY(Double.parseDouble(posValues[1])); 
     model.getBats()[0].setX(Double.parseDouble(posValues[2])); 
     model.getBats()[0].setY(Double.parseDouble(posValues[3])); 
     model.getBats()[1].setX(Double.parseDouble(posValues[4])); 
     model.getBats()[1].setY(Double.parseDouble(posValues[5])); 

     //Check for keyboard input 

     if(PongController.moveUp == true && PongController.moveDown == false) 
     { 
      System.out.println("Up"); 
      PongController.moveUp = false; 
     } 
     else if(PongController.moveUp == false && PongController.moveDown == true) 
     { 
      System.out.println("Down"); 
      PongController.moveDown = false; 
     } 
     else 
     { 
      //serverOut.println("nothing"); 
     } 


    } 
} 

} 

一直停留在这一段时间,并且似乎无法找到任何教程如何从客户端使用多播数据包发送给服务器。

+0

首先,在将字符串交给parseDouble之前检查字符串中的字符(0-9,.-等),或者捕获异常parseDouble throws。 – mstrthealias 2013-03-02 19:37:01

+1

为了调试目的,在服务器端使用'SOP'打印发送给客户端的数据包。 – 2013-03-02 19:50:33

+0

我能不能摆脱组播套接字,而只是使用DatagramSocket呢?我想要的只是使用UDP发送数据以及由客户端发送的数据。 – Canvas 2013-03-02 20:16:15

回答

4

您正在经历组播环回。用MulticastSocket#setLoopbackMode(true)将其关闭,或者如果该对等体刚刚发送到多播组,则不接收,则根本不需要加入该组。

+0

重点。这是有道理的。 – skygeek 2017-07-27 10:20:02