2011-10-03 69 views
0

我想通过socket发送一个字符串,但我只是有一些问题。我试图发送的字符串是; (注意:这是一个字符串不是XML)如何在java中的socket通信中使用BufferedWriter?

<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(); 

读取字符串在服务器上。

能否请你帮我,我怎么能解决呢?

谢谢大家

回答

1

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

尝试读入一个字节的缓冲区,然后再尝试将它做成一个字符串:

byte[] buf = new byte[4096]; 

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

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

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

1

可能是一个缺少换行符作为BufferedReader.readLine不会返回,直到新的行字符可在流。

1

检查个例子说吧,你已经写了一些XML包含比一行多。第一行是:

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

在服务器上你再读取第一行 - 你已经有了一个readLine()电话。毫不奇怪,这是给你一行文本。

如果你想发送包括换行符作为一个行的字符串,你需要逃生者换行符。

一个更好的选择是不依赖于线在所有:长度前缀的每个串发送,所以发送:

  • 长度(以字节为单位),为4个字节
  • 字符串数据(作为一个字节阵列)

在阅读方面,你会读出4个字节来找出消息的长度,然后读取消息转换为字节数组,然后构造从字节数组的字符串。

DataInputStreamDataOutputStream可以帮助你做到这一点相当简单。请注意,您应该明确指定您用于所有字符串的编码;在大多数情况下,UTF-8是一个很好的起点。

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()流服务器端。一旦收到所有数据,让客户端关闭套接字。这样,你不能太早关闭()套接字。