2013-03-02 58 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