0

我正在尝试通过套接字发送一个字符串,但我遇到了一些问题。我要发送的字符串是;(注意:这是一个字符串而不是 XML)

<message>
<header>
<messageType>snmp</messageType>
<sendFrom>192.168.0.16</sendFrom>
<hostName>oghmasysMehmet</hostName>
<sendTo>192.168.0.12</sendTo>
<receiverName>Mehmet</receiverName>
<date>03/10/2011</date>
</header>
<body>
<snmpType>getbulk</snmpType>
<ip>127.0.0.1</ip>
<port>161</port>
<oids>
  <oid>1.3.6.1.2.1.1.3.0</oid>
</oids>
<community>community</community>
<nR>0</nR>
<mR>5</mR>
</body>
</message>

但是当我查看我从服务器得到的东西时,它只是;

<?xml version="1.0" encoding="UTF-8"?>

我不知道是什么问题:

我在用 ,

socket = new Socket(localIP, Integer.parseInt(localPort));
out = new PrintWriter(socket.getOutputStream(), true);

从客户端发送字符串并使用,

in = new BufferedReader(new InputStreamReader(client.getInputStream()));
line = in.readLine();

读取服务器上的字符串。

你能帮我解决一下吗?

谢谢你们

4

5 回答 5

1

可能是缺少换行符,因为 BufferedReader.readLine 在流上可用换行符之前不会返回。

于 2011-10-03T15:15:49.607 回答
1

好吧,您已经写出了一些包含不止一行的 XML。第一行是:

<?xml version="1.0" encoding="UTF-8"?>

在服务器上,您已经阅读了第一行 - 您接到了一个readLine()电话。不出所料,这给了你一行文本。

如果要将包含换行符的字符串作为单行发送,则需要转义这些换行符。

一个更好的选择是根本不依赖行:长度为您发送的每个字符串添加前缀,因此您发送:

  • 长度(以字节为单位)为 4 个字节
  • 字符串数据(作为字节数组)

在读取方面,您将读取 4 个字节以了解消息的长度,然后将消息读入字节数组,然后从该字节数组构造字符串。

DataInputStream并且DataOutputStream可以帮助您合理简单地做到这一点。请注意,您绝对应该指定用于所有字符串的编码;在大多数情况下,UTF-8 是一个很好的起点。

于 2011-10-03T15:17:39.497 回答
1

卢卡斯有答案,我相信。就个人而言,我不相信 readLine() 这样做是假设您正在接收套接字上的有效字符串数据....这是一个非常糟糕的假设!

尝试先读入一个字节缓冲区,然后尝试将其变成一个字符串:

byte[] buf = new byte[4096];

int actualNumberOfBytesRead = socket.getInputStream().read(buf);

String dataString = new String(buf, 0, actualNumberOfBytesRead);

...现在,我的示例有一些问题,但重点(应该)是 =D

于 2011-10-03T15:22:23.860 回答
0

我认为你应该循环 in.readline 直到没有进一步的输入可用。

检查http://download.oracle.com/javase/tutorial/networking/sockets/readingWriting.html上的示例

于 2011-10-03T15:17:15.690 回答
0

首先:您应该真正使用缓冲区来解析服务器发送给您的任何内容。请参阅http://www.kodejava.org/examples/266.html以获得一个很好的示例。

如果您不喜欢将其添加到您的代码中,您可以使用 Apache Commons IO 库来执行以下操作:

ByteArrayInputStream out = new ByteArrayInputStream();
IOUtils.readFully( in, out );
String output = new String( out.getBytes(), "UTF-8");

请注意,您应该注意 flush() 流服务器端。让客户端在收到所有数据后立即关闭套接字。这样,您就不能过早地关闭()套接字。

于 2011-10-03T16:18:03.547 回答