我正在尝试通过套接字发送字符串,但我只是遇到了一些问题。我要发送的字符串是; (注意:这是一个非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();
读取服务器上的字符串。
你能帮我解决一下吗?
谢谢大家
答案 0 :(得分:1)
可能是缺少的换行符,因为BufferedReader.readLine在流上有新行字符后才会返回。
答案 1 :(得分:1)
嗯,你已经写出了一些包含多行的XML。第一行是:
<?xml version="1.0" encoding="UTF-8"?>
在服务器上,您已阅读第一行 - 您有一个readLine()
电话。不出所料,这会给你一行文字。
如果您想将包含换行符的字符串作为一行发送,则需要转义这些换行符。
一个更好的选择是根本不依赖于行:你发送的每个字符串的长度前缀,所以你发送:
在读取方面,您将读取4个字节以查明消息的长度,然后将消息读入字节数组,然后从该字节数组构造字符串。
DataInputStream
和DataOutputStream
可以帮助您合理地完成这项工作。请注意,您应该明确指定用于所有字符串的编码;在大多数情况下,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()流服务器端。让客户端在收到所有数据后立即关闭套接字。这样,您就不能过早关闭()套接字。