2014-05-12 9 views
5

Ok, więc mam projekt, w którym pracuję z klientem (napisanym w Lua) i serwerem (napisanym w Javie). Używam LuaSocket dla klienta i DatagramSockets dla serwera. Problem polega na tym, że wysyłam jeden ciąg od klienta w Lua i odbieram go na serwerze (i konwertuję bajty na ciąg), nie rozpoznaje on wartości ciągu jako równej temu, co powinien (I ' m przy użyciu .equals() do oceny). Wydrukowałem wynik i porównałem go z ciągiem (wszystko wyrejestrowałem); Porównywałem nawet bajty (używając .getBytes()), nawet wymeldowałem się. Najbardziej irytujące jest to, że gdy analizuję ciąg za pomocą .startsWith(), sprawdza on wartość true, ale nic innego nie działa. Sprawdziłem kodowanie ciągów znaków w obu językach, ale jestem stosunkowo nowy w stosunku do gniazd i to jest poza mną.Błąd komunikacji z gniazdem Java do Lua

Edit:

momencie pisania niektóre przykładowy kod do wykazania problem, rozwiązać go. Oto kod:

Klient:

local socket = require "socket" 
local udp = socket.udp() 
udp:settimeout(0) 
udp:setpeername("localhost", 1234) 
udp:send("foo") 

Serwer:

public class Main 
{ 
     public static void main(String args[]) throws Exception 
    { 
     DatagramSocket server = new DatagramSocket(1234); 

     byte[] incomingBytes = new byte[512]; 

     DatagramPacket incomingPacket = new DatagramPacket(incomingBytes, incomingBytes.length); 

     server.receive(incomingPacket); 

     String received = new String(incomingBytes); 

     System.out.println(received); 

     System.out.println(received.equals("foo")); 

     for (byte b : received.getBytes()) 
     { 
      System.out.print(b + " "); 
     } 
     System.out.print("\n"); 

     for (byte b : "foo".getBytes()) 
     { 
      System.out.print(b + " "); 
     } 
     System.out.print("\n"); 
    } 
} 

Rezultat:

foo 
false 
102 111 111 0 0 0 *I'm not going to include all but there are 506 more* 
102 111 111  

Ciąg I został zbadaniu bajtów z uprzednio została podzielona na kilka punktów i to wyjaśniałoby, dlaczego tego nie zauważyłem.

+1

Czy możesz zapisać swój kod (w tym sprawdzenia, które wymieniłeś z '.getBytes()' i tym podobne)? Wygląda na to, że wykonałeś przyzwoitą pracę przy próbie debugowania, ale powiedzenie "powinno działać, ale nie działa", nie dostarcza wielu informacji, jak ci pomóc. – SJuan76

+0

@ SJuan76 Dzięki za poradę, to jest mój pierwszy wpis na StackOverflow. – user3626355

+0

Nie jestem osobą java, ale wygląda na to, że 'new String (incomingBytes)' tworzy ciąg z * wszystkich * bajtów nie tylko tych, które zawierają odebrane dane. Powinieneś raczej utworzyć ciąg z bardzo dużej ilości danych, które faktycznie otrzymałeś zamiast całego bufora odbiorczego. –

Odpowiedz

0

Rzeczywiście, jak zauważył Etan, tworzysz ciąg z całego bufora - wszystkie 512 bajtów - zamiast ciągu o odpowiedniej długości, więc utworzony ciąg ma na koniec wiele bajtów zerowych .

prosty fix byłoby użyć Stringconstructor że odcina bufor w pozycji i długości określonej, wraz z liczbą bajtów otrzymanych z pakietem z DatagramPacket.getLength

dokonać korekty przypisywania received do

String received = new String(incomingBytes, 0, incomingPacket.getLength()); 
Powiązane problemy