2016-12-23 3 views
3

У меня проблема с кодированием UDP-связи в JavaFx.кодирование UDP-связи в JavaFx

Код способен отправлять сообщения, но не способен принимать сообщения.

Что я должен изменить в исходном коде, чтобы получить сообщение?

Вот исходный код:

public class JavaFXApplication10 extends Application { 

public DatagramSocket receivesocket; 
public DatagramPacket receivepacket; 
public DatagramSocket sendsocket;  
public DatagramPacket sendpacket; 
public InetSocketAddress remoteAdress; 

public Label  label_IP; 
public TextField tx_IP; 
public Label  label_SENDPORT; 
public Label  label_RECEIVEPORT; 
public TextField tx_SENDPORT; 
public TextField tx_RECEIVEPORT; 
public Button bt_co; 
public Button bt_start ; 
private String message; 
private XYChart.Series series; 
private Timeline timer; 
private static String IP = "192.168.121.23"; 
private static Integer SENDPORT = 12345;  
private static Integer RECEIVEPORT = 12345;  
public double time_counter=0.0; 
private String text; 
private byte[] b; 
@Override 

public void start(Stage stage) throws Exception{ 


    /* text */ 
    tx_IP = TextFieldBuilder.create().text(IP).build(); 

    /* text */ 
    tx_SENDPORT = TextFieldBuilder.create().text(""+SENDPORT).build(); 

    /* text */ 
    tx_RECEIVEPORT = TextFieldBuilder.create().text(""+RECEIVEPORT).build(); 

    /*button */ 
    bt_co = ButtonBuilder.create().text("Connection") 
      .prefWidth(200) 
      .alignment(Pos.CENTER) 
      .id("connect") 
      .build(); 

    /* button_start */ 
    bt_start = ButtonBuilder.create().text("START") 
      .id("start") 
      .build(); 


    /* timer */ 
    timer = new Timeline(new KeyFrame(Duration.millis(1000), new EventHandler<ActionEvent>(){ 
     @Override 
     public void handle(ActionEvent event) { 

      time_counter = time_counter+1; // time 

     } 
    })); 
    timer.setCycleCount(Timeline.INDEFINITE); 
    timer.play(); 

    /*figure*/ 
    stage.setTitle("Line Chart Sample"); 

    final NumberAxis xAxis = new NumberAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 
    xAxis.setLabel("Time [s]"); 
    yAxis.setLabel("Force [N]"); 
    //creating the chart 
    final LineChart<Number,Number> lineChart = 
      new LineChart<Number,Number>(xAxis,yAxis); 

    lineChart.setTitle(""); 

    //defining a series 
    series = new XYChart.Series(); 
    series.setName("Force"); 
    series.getData().add(new XYChart.Data(0.0,0.0)); 
    lineChart.getData().add(series); 




    HBox root1 = HBoxBuilder.create().spacing(100).children(tx_IP ,tx_SENDPORT,tx_RECEIVEPORT).build(); 
    HBox root2 = HBoxBuilder.create().spacing(50).children(bt_co).build(); 
    HBox root3 = HBoxBuilder.create().spacing(25).children(bt_start).build(); 
    VBox root4 = VBoxBuilder.create().spacing(25).children(root1,root2,root3,lineChart).build(); 


    Scene scene = new Scene(root4); 

    recieve_UDP(); 


    scene.addEventHandler(ActionEvent.ACTION,actionHandler); 



    stage = StageBuilder.create().width(640).height(640).scene(scene).title(" ").build(); 
    stage.show(); 
} 


private void recieve_UDP() throws SocketException, IOException { 


    ScheduledService<Boolean> ss = new ScheduledService<Boolean>() 
    { 
     @Override 
     protected Task<Boolean> createTask() 
     { 

      Task<Boolean> task = new Task<Boolean>() 
      { 
       @Override 
       protected Boolean call() throws Exception 
       { 
        receivesocket = null; 

        byte[] receiveBuffer = new byte[1024]; 
        receivepacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); 
        receivesocket = new DatagramSocket(RECEIVEPORT); 


        receivesocket.receive(receivepacket); 
        message = new String(receivepacket.getData(),0, receivepacket.getLength()); 

        System.out.println(message); 



        receivesocket.close(); 
        return true; 
       }; 
      }; 


      return task;   
     } 

    }; 
    ss.start(); 
} 



EventHandler<ActionEvent> actionHandler = new EventHandler<ActionEvent>(){ 
    public void handle (ActionEvent e){ 


     ////////////////////////////////////////////////////////////////////////////// 
     Button src =(Button)e.getTarget(); 
     text = src.getId(); 
     System.out.println(text); 
     b = new byte[5]; 

     if(text == "connect"){ 

      String text_IP = tx_IP.getText(); 

      label_IP.setText(text_IP); 

      IP = text_IP; 


      String text_SENDPORT = tx_SENDPORT.getText(); 


      label_SENDPORT.setText(text_SENDPORT); 

      SENDPORT = Integer.parseInt(text_SENDPORT); 

      String text_RECEIVEPORT = tx_RECEIVEPORT.getText(); 

      label_RECEIVEPORT.setText(text_RECEIVEPORT); 

      RECEIVEPORT = Integer.parseInt(text_RECEIVEPORT); 

     } 
     else{ 


       remoteAdress = new InetSocketAddress(IP, SENDPORT); 

     sendsocket = null; 


       try { 
        sendsocket = new DatagramSocket(); 
       } catch (SocketException ex) { 
        Logger.getLogger(JavaFXApplication10.class.getName()).log(Level.SEVERE, null, ex); 
       } 

       } 
       if(text=="start"){ 

        b[0] = (byte)0x02; 
        text ="OK"; 


       } 

       else{ 

       } 


     Send_UDP(); 
     /////////////////////////////////////////////////////// 
    } 
}; 
public void Send_UDP(){ 

    /////////////////////////////////////////////////////// 
if(text=="OK"){ 

      sendpacket = new DatagramPacket(b, b.length,remoteAdress); 

      try { 

       sendsocket.send(sendpacket); 
      } catch (IOException ex) { 
       Logger.getLogger(JavaFXApplication10.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      sendsocket.close(); 
      text=""; 

      } 
     else {} 
     /////////////////////////////////////////////////////// 

} 


public static void main(String[] args) { 
    launch(args); 
} 
} 
+1

Что значит «не способен»? Вы получили сообщение об ошибке? Вы прошли через код в отладчике? – OldProgrammer

+1

'if (text ==" connect ")', 'if (text ==" start ")' и 'if (text ==" OK ")' скорее всего, не удастся. См. Http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java. – VGR

+0

Я могу отправить сообщение с ПК A, который исполняет этот исходный код на ПК B, который используется для тестирования UDP. Но я не могу получить сообщение от ПК A, которое исполняет этот исходный код на ПК B (это используется для тестирования UDP-инструмента. Я не могу получить сообщение. Кроме того, я не могу использовать один и тот же порт (порт отправки и получить порт). – kkj

ответ

2

Вы код действительно нечеткий, может быть, я не понимаю, цели всех этих блоков коды, но я могу вам сказать, UDP связи довольно прост, позвольте мне первый пролить некоторый свет на быстрый способ работает UDP связь:

UDP связи курсы повышения

Пожалуйста, обратите внимание, что я использовал лишь некоторые фрагменты кода ниже для демонстрации так любезно не смотрите, то для полноты, полный код можно найти в коде, который я вставил в конец.

  • UDP может использоваться как для одноадресной передачи, так и для многоадресной передачи. Если UDP используется для одноадресной связи, то всегда будет клиент UDP, запрашивающий что-то с UDP-сервера, однако, если UDP используется для многоадресной передачи, тогда UDP-сервер будет многоадресным/широковещательным сообщением всем слушающим клиентам UDP.
  • (я теперь больше поговорить о UDP одноадресной) UDP-сервер будет прослушивать сетевой порт для клиента запрашивает DatagramSocket socket = new DatagramSocket(8002); socket.receive(packet);

  • UDP-клиент хочет общаться с UDP-сервера, поэтому он открывает DatagramSocket и отправьте DatagramPacket над ним. DatagramPacket будет содержать конечные точки UDP-сервера.

  • После UDP клиент отправил сообщение, используя socket.send(packet);, он будет готовиться к получению ответа от сервера UDP, используя socket.receive(packet); (Я думаю, что это, где вам не хватает) Самое главное, чтобы понять, что если клиент не готовится к получению, то он не сможет получить то, что UDP-сервер будет отправлять, потому что в случае UDP нет соединения между UDP-клиентом и UDP-сервером, поэтому UDP должен прослушиваться после отправки сообщения.
  • UDP-сервер получит запрос от клиента UDP, обработает запрос и отправит с использованием sendingDatagramSocket.send(packet);. Он подготовит DatagramPacket с использованием ответа и конечных точек клиента UDP.
  • UDP-клиент, который прослушивает, как указано выше, socket.receive(packet); получит ответ от UDP-сервера. Важно отметить, что если клиент UDP не прослушивает ИЛИ не прослушивает тот же порт, который он открыл при выполнении запроса (в основном используя тот же объект DatagramSocket, который использовался для отправки запроса), тогда клиент UDP никогда не получит никакого UDP-сервера отправляется.

Ответ на вопросы OP в

Основной проблемой является то, что в Send_UDP вы только отправлять, но не получает и в recieve_UDP вы только получать, но не отправлять.

Итак, в основном вам необходимо как отправлять, так и получать в UDP-клиент и UDP-сервер, его просто было бы наоборот, но вам нужно делать обе вещи.

сервер Пример UDP и клиент UDP

UDP клиент:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.util.Date; 

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

     // get a datagram socket 
     DatagramSocket socket = new DatagramSocket(); 
     System.out.println("### socket.getLocalPort():" + socket.getLocalPort() + " | socket.getPort(): " + socket.getPort()); 

     // send request 
     byte[] buf = "Hello, I am UDP client".getBytes(); 
     InetAddress address = InetAddress.getByName("localhost"); 
     DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8002); 
     socket.send(packet); 

     // get response 
     packet = new DatagramPacket(buf, buf.length); 
     System.out.println("Waiting to receive response from server." + new Date()); 
     socket.receive(packet); 
     System.out.println("Got the response back from server." + new Date()); 

     // display response 
     String received = new String(packet.getData()); 
     System.out.println("Quote of the Moment: " + received); 

     socket.close(); 
    } 
} 

UDP сервер:

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

public class SimpleUDPServer { 

    public static void main(String[] args) throws SocketException, InterruptedException { 
     DatagramSocket socket = new DatagramSocket(8002); 

     while (true) { 
      try { 
       byte[] buf = new byte[256]; 

       // receive request 
       DatagramPacket packet = new DatagramPacket(buf, buf.length); 
       socket.receive(packet); 

       System.out.println("### socket.getLocalPort():" + socket.getLocalPort() + " | socket.getPort(): " + socket.getPort()); 

       // figure out response 
       String dString = "Server is responding: asd asdd"; 
       buf = new byte[256]; 
       buf = dString.getBytes(); 

       // send the response to the client at "address" and "port" 
       InetAddress address = packet.getAddress(); 
       int port = packet.getPort(); 
       System.out.println("Data from client: " + new String(packet.getData())); 
       packet = new DatagramPacket(dString.getBytes(), dString.getBytes().length, address, port); 
       System.out.println("### Sending for packet.hashCode(): " + packet.hashCode() + " | packet.getPort(): " + packet.getPort()); 

       //Thread.sleep(5000); 

       System.out.println("Now sending the response back to UDP client."); 

       DatagramSocket sendingDatagramSocket = new DatagramSocket(); 
       sendingDatagramSocket.send(packet); 
       sendingDatagramSocket.close(); 
       System.out.println("I am done"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

Дальнейшие показания

Я сильно рекомендуем прочитать this Учебник по Java, если не полный, то по крайней мере раздел «Написание сервера и сервера датаграмм».

Смежные вопросы