2014-02-14 45 views
1

我想要做的是1)在客戶端,將double(當前爲1.75)轉換爲bytes[],並使用DatagramPacket將其發送到服務器; 2)在服務器端,接收請求,得到bytes[]數據,將其轉換爲double,並打印出來。發送和接收DatagramPacket包含雙重

UDPClient.java:

import java.net.*; 
import java.io.*; 
import java.nio.ByteBuffer; 

public class UDPClient { 

    private static byte[] doubleToByteArray(double x) { 
     byte[] bytes = new byte[8]; 
     ByteBuffer.wrap(bytes).putDouble(x); 
     return bytes; 
    } 

    public static void main(String args[]) { 
     DatagramSocket aSocket = null; 
     try { 
      aSocket = new DatagramSocket(); 
      byte[] m = doubleToByteArray(1.75); 
      InetAddress aHost = InetAddress.getByName("localhost"); 
      int serverPort = 6789; 
      DatagramPacket request 
        = new DatagramPacket(m, m.length, aHost, serverPort); 
      aSocket.send(request); 
     } catch (SocketException e) { 
      System.out.println("Socket: " + e.getMessage()); 
     } catch (IOException e) { 
      System.out.println("IO: " + e.getMessage()); 
     } finally { 
      if (aSocket != null) { 
       aSocket.close(); 
      } 
     } 
    } 
} 

UDPServer.java:

import java.net.*; 
import java.io.*; 
import java.nio.ByteBuffer; 

public class UDPServer { 

    private static double byteArrayToDouble(byte[] bytes) { 
     double d = 0.0; 
     ByteBuffer.wrap(bytes).putDouble(d); 
     return d; 
    } 

    public static void main(String args[]) { 
     DatagramSocket aSocket = null; 
     try { 
      aSocket = new DatagramSocket(6789); 
      // create socket at agreed port 
      byte[] buffer = new byte[1000]; 
      while (true) { 
       DatagramPacket request = new DatagramPacket(buffer, buffer.length); 
       aSocket.receive(request); 
       System.out.println(new String(request.getData(), 0, request.getLength())); 
       // output: some messy characters 
       System.out.println(byteArrayToDouble(request.getData())); 
       // output: "0.0" (of course, unfortunately) 
      } 
     } catch (SocketException e) { 
      System.out.println("Socket: " + e.getMessage()); 
     } catch (IOException e) { 
      System.out.println("IO: " + e.getMessage()); 
     } finally { 
      if (aSocket != null) { 
       aSocket.close(); 
      } 
     } 
    } 
} 

我應該如何修改我的發送/接收裝置,使正確的字節傳送?

回答

1
private static double byteArrayToDouble(byte[] bytes) { 
     double d = 0.0; 
     ByteBuffer.wrap(bytes).putDouble(d); 
     return d; 
    } 

這是將字節數組轉換爲double的一種奇怪的方式。這對雙打沒有任何作用。它不能。 Java中沒有引用參數。應該是得到

ByteBuffer.wrap(request.getData(), 0, request.getLength()).getDouble(). 

Ë& OE

+0

很抱歉的混亂:基本上整個方法可以替換。但是'new String'行僅僅用於查看請求中包含的數據是否仍然格式良好。我使用方法'byteArrayToDouble'將字節數組轉換爲double。 – goldfrapp04

+0

但是'doubleToByteArray()'是一樣的。'一段代碼如何在兩個方向上轉換?請參閱編輯。 – EJP

+0

謝謝。我在這裏太粗心了。 – goldfrapp04