2017-02-14 72 views
0

我已經編寫了用於客戶端和服務器之間的音頻文件(mp3)傳輸的代碼。第一個服務器啓動並等待數據包分組接收,然後客戶端啓動並向服務器發送UDP數據報分組。在JAVA中使用UDP的音頻文件傳輸

\服務器

  serverSocket = new DatagramSocket(4000); 
      int packetsize=1024; 
      FileOutputStream fos = null; 
      try { 
       fos = new FileOutputStream("zz.wav"); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       double nosofpackets=Math.ceil(((int) (new File("F:\\nirmal\\1.wav")).length())/packetsize); 
       byte[] mybytearray = new byte[packetsize]; 
       DatagramPacket receivePacket = new DatagramPacket(mybytearray,mybytearray.length); 

       System.out.println(nosofpackets+" "+mybytearray+" "+ packetsize); 

       for(double i=0;i<nosofpackets+1;i++) 
       { 

        serverSocket.receive(receivePacket); 
        byte audioData[] = receivePacket.getData(); 
        System.out.println("Packet:"+(i+1)); 
        bos.write(audioData, 0,audioData.length); 
       } 

\客戶

File myFile = new File("F:\\nirmal\\1.wav"); 
    DatagramSocket ds=new DatagramSocket(9000); 
    DatagramPacket dp; 
    int packetsize=1024; 
    double nosofpackets; 
    noofpackets= =Math.ceil(((int) myFile.length())/packetsize); 

    BufferedInputStream bis; 
    bis = new BufferedInputStream(new= FileInputStream(myFile));   
    for(double i=0;i<nosofpackets+1;i++) 
     { 
      byte[] mybytearray = new byte[packetsize]; 
      bis.read(mybytearray, 0, mybytearray.length); 
      System.out.println("Packet:"+(i+1)); 
     dp=new DatagramPacket(mybytearray,mybytearray.length,InetAddress.getByName("172.17.13.46"),4000); 
        } 

當兩個客戶端ANS服務器正在運行的服務器,然後停留在serverSocket.receive得到(receivePacket),如服務器產品線不接收任何packets.I不知道我在做什麼錯誤。

回答

0

問題出在客戶端。

您需要通過DatagramSocket發送DatagramPackets以在服務器端接收。 DatagramScoket是一個客戶端套接字,所以你不需要爲它保留一個端口號。如果您在本地計算機上運行代碼,更好地利用"localhost""127.0.0.1"

public class UDPClient { 

    public void send() throws IOException, InterruptedException { 
     File myFile = new File("aa.hex"); 
     DatagramSocket ds = null; 
     BufferedInputStream bis = null; 
     try { 
      ds = new DatagramSocket(); 
      DatagramPacket dp; 
      int packetsize = 1024; 
      double nosofpackets; 
      nosofpackets = Math.ceil(((int) myFile.length())/packetsize); 

      bis = new BufferedInputStream(new FileInputStream(myFile)); 
      for (double i = 0; i < nosofpackets + 1; i++) { 
       byte[] mybytearray = new byte[packetsize]; 
       bis.read(mybytearray, 0, mybytearray.length); 
       System.out.println("Packet:" + (i + 1)); 
       dp = new DatagramPacket(mybytearray, mybytearray.length, InetAddress.getByName("127.0.0.1"), 4000); 
       ds.send(dp);      
      } 
     }finally { 
      if(bis!=null) 
       bis.close(); 
      if(ds !=null) 
       ds.close(); 
     } 

    } 
} 

當我prooved代碼服務器無法接收來自客戶端的所有分組。我通過在ds.send(dp)之後添加Thread.sleep(10L)指令來修復它。

+0

你用mp3或者wav文件測試過了嗎? –

+0

我用二進制文件測試過它。 我通過計算原始文件sha1和命令文件檢查了2個文件。 SHA1 ---------------------------------------- ------ ------- ------------ 9574F1AE5946D8E6A86351389445FECF80242C25 aa.hex 9574F1AE5946D8E6A86351389445FECF80242C25 zz.hex 正如你可以看到這兩個文件具有相同SHA所以我覺得是竟被使用沒有問題mp3或wav文件。 – jmarques