如何在java中的socket通信中使用BufferedWriter?

时间:2011-10-03 15:13:15

标签: java sockets serversocket

我正在尝试通过套接字发送字符串,但我只是遇到了一些问题。我要发送的字符串是; (注意:这是一个非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();

读取服务器上的字符串。

你能帮我解决一下吗?

谢谢大家

5 个答案:

答案 0 :(得分:1)

可能是缺少的换行符,因为BufferedReader.readLine在流上有新行字符后才会返回。

答案 1 :(得分:1)

嗯,你已经写出了一些包含多行的XML。第一行是:

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

在服务器上,您已阅读第一行 - 您有一个readLine()电话。不出所料,这会给你一行文字。

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

一个更好的选择是根本不依赖于行:你发送的每个字符串的长度前缀,所以你发送:

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

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

DataInputStreamDataOutputStream可以帮助您合理地完成这项工作。请注意,您应该明确指定用于所有字符串的编码;在大多数情况下,UTF-8是一个很好的起点。

答案 2 :(得分:1)

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

首先尝试读入字节缓冲区,然后尝试将其变为字符串:

byte[] buf = new byte[4096];

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

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

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

答案 3 :(得分:0)

我认为你应该在in.readline上循环,直到没有其他输入可用。

检查http://download.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

上的示例

答案 4 :(得分: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()流服务器端。让客户端在收到所有数据后立即关闭套接字。这样,您就不能过早关闭()套接字。