2016-04-07 18 views
0

Udp.Connect dizeleri kullanarak dize komutlarını aktarımı yapan küçük bir program geliştiriyorum. Belirli bir dizenin tam olarak alınmamasına rağmen gönderdiğim doğru dizeler doğru alındı. sorunu olan taraf veya alıcı taraf. Doğru olarak alınan dizeye örnek: "connect 123.123.1.1" Doğru şekilde alınmayan dize: "a/name/123.123.1.1" Bu alındığında aldığım: "a/name/123." göndermek için kodu: ulasmasindanJava datagramsocket eksik iletiyi alır

public void sendToAll(String massage) { 
    //send massage to all clients 

    byte[] sendData = new byte[1500]; 
    //clients is a linked list 
    for (int i = 0; i < clients.size(); i++) { 
     String ip = clients.get(i).ip; 
     sendData = massage.getBytes(); 
     try { 
      InetAddress IPAddress = InetAddress.getByName(ip); 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 11222); 
      clientSocket.send(sendPacket); 
     } catch (Exception e) { 

     } 
    } 
} 

kodu: Şu anda sorunun sebebini bilmiyoruz rağmen

byte[] receiveData = new byte[1500]; 
while (true) { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     String massage = new String(receivePacket.getData()); 

     //operations for other commands 

     if (massage.startsWith("a/")) { 

      String[] info = massage.split("/"); 
      //operations for this command 
     } 
} 

cevap

0

, senin kodda bakmak için bir şeyler buldu ve belki bir Bunların hepsi bir şekilde bunun sebebi ile ilgilidir. İlk olarak, gönderme yönteminde, dize komutlarını baytlara kodlamadan önce 1500 boyutunda bir sendData tamponu ayırırsınız. GetBytes() yöntemi yeni bir bayt dizisi döndürdüğü için buna gerek yoktur. Ancak, bu gerçekten sorun yaratmamalı. daha Beni endişelendiren alma yöntemi olup, bu hat ne

: Java API belgeleri uyarınca

String massage = new String(receivePacket.getData()); 

, paketin ait yöntem getData() geçirilen bir tampon döndürür. Bu arabellek 1500 bayt uzunluğundadır ve bu şekilde bir String kurucu kullanmayı denemek, tüm 1500 bayt almayı sağlar. Muhtemelen:

String massage = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
+0

Çok teşekkür ederiz. Bu işe yaradı. – Omar

+0

havalı. yine de neden daha önce böyle çalıştığını merak ediyor. Kısaltılmış değil, aşırı uzun bir dize olmalı, inanıyorum. –

İlgili konular