【发布时间】:2014-06-30 09:18:46
【问题描述】:
好的,所以我有一个项目,我正在使用客户端(用 Lua 编写)和服务器(用 Java 编写)。我将 LuaSocket 用于客户端,将 DatagramSockets 用于服务器。问题是当我在 Lua 中从客户端发送一个字符串并在服务器上接收它(并将字节转换为字符串)时,它无法识别字符串的值等于它应该是什么(我' m 使用 .equals() 进行评估)。我已经打印了结果并将其与字符串进行了比较(所有已签出);我什至比较了字节(使用.getBytes()),他们甚至检查了。最烦人的部分是,当我使用 .startsWith() 分析字符串时,它的评估结果为真,但没有其他任何作用。我研究了这两种语言的字符串编码,但我对套接字比较陌生,这超出了我的范围。
编辑:
在编写了一些示例代码来演示该问题后,我解决了它。代码如下:
客户:
local socket = require "socket"
local udp = socket.udp()
udp:settimeout(0)
udp:setpeername("localhost", 1234)
udp:send("foo")
服务器:
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");
}
}
结果:
foo
false
102 111 111 0 0 0 *I'm not going to include all but there are 506 more*
102 111 111
我之前一直在检查字节的字符串在几个点被拆分,这可以解释为什么我没有注意到这一点。
【问题讨论】:
-
你能写下你的代码吗(包括你提到的
.getBytes()之类的检查)?看起来您在尝试调试它方面做得不错,但是说“它应该可以工作,但不能”并没有提供太多帮助您的信息。 -
@SJuan76 感谢您的建议,这是我在 StackOverflow 上的第一篇文章。
-
我不是 java 人,但在我看来
new String(incomingBytes)正在从 所有 字节中创建一个字符串,而不仅仅是包含接收数据的字节。您可能应该只根据实际收到的数据创建一个字符串,而不是整个接收缓冲区。