2014-05-12 7 views
5

Okay, so habe ich ein Projekt, wo ich mit einem Client (in Lua geschrieben) und einem Server (in Java geschrieben) arbeiten. Ich verwende LuaSocket für den Client und DatagramSockets für den Server. Das Problem ist, wenn ich eine Zeichenfolge vom Client in Lua sende und es auf dem Server empfange (und die Bytes in eine Zeichenkette umwandle), erkennt es den Wert der Zeichenkette nicht als gleich, was es sein sollte (I ' m mit .equals() zur Auswertung). Ich habe das Ergebnis gedruckt und mit der Zeichenfolge verglichen (alles ausgecheckt); Ich habe sogar die Bytes verglichen (mit .getBytes()), sie haben sogar ausgecheckt. Der nervigste Teil davon ist, dass wenn ich die Zeichenkette mit .startsWith() analysiere, sie wahr bewertet, aber nichts anderes funktioniert. Ich habe mir die String-Codierung beider Sprachen angeschaut, aber ich bin relativ neu in Sockets und das geht über mich hinaus.Java zu Lua Socket Kommunikation Fehler

Edit:

auf einige Beispiel-Code zu schreiben, das Problem zu demonstrieren, ich löste es. Hier ist der Code:

Auftraggeber:

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

Server:

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"); 
    } 
} 

Das Ergebnis:

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

Die Zeichenfolge Ich hatte die Bytes wurde die Prüfung von zuvor aufgespalten wurde mehrere Punkte, und das würde erklären, warum ich das nicht bemerkt habe.

+1

Könnten Sie Ihren Code aufschreiben (einschließlich der Checks, die Sie mit '.getBytes()' und dergleichen erwähnen)? Es sieht so aus, als ob Sie eine anständige Arbeit bei dem Versuch, es zu debuggen, getan haben, aber zu sagen "es sollte funktionieren, aber es tut nicht" bietet nicht viele Informationen, wie Sie helfen können. – SJuan76

+0

@ SJuan76 Danke für den Hinweis, das ist mein erster Post auf StackOverflow. – user3626355

+0

Ich bin kein Java-Person, aber das sieht für mich wie 'neue String (incomingBytes)' erstellt eine Zeichenfolge aus * alle * die Bytes nicht nur diejenigen, die empfangene Daten enthalten. Sie sollten wahrscheinlich nur eine Zeichenkette aus so vielen Daten erstellen, die Sie tatsächlich erhalten haben, anstatt den gesamten Empfangspuffer zu verwenden. –

Antwort

0

In der Tat, wie Etan sagte, Sie erstellen eine Zeichenfolge aus dem gesamten Puffer - alle 512 Bytes - anstelle einer Zeichenfolge der richtigen Länge, so dass die Zeichenfolge, die erstellt wird, viele Null Bytes am Ende hat .

wäre eine einfache Lösung zu benutzen, die Stringconstructor, die den Puffer an der Position und Länge, die Sie zusammen mit der Anzahl von Bytes aus dem Paket von DatagramPacket.getLength

Ändern Sie die Zeile Zuordnung received zu

empfangen angeben, abschneidet
String received = new String(incomingBytes, 0, incomingPacket.getLength());