在原始套接字上编码字符串 - 额外字符

时间:2014-07-02 06:12:33

标签: java c# xml sockets character-encoding

我正在对正在阅读我正在发送的XML时遇到问题的商业应用程序进行故障排除。

我的应用程序是Java,商业应用程序是在Windows上用C#.NET 4.0编写的。 C#应用程序正在侦听原始XML的简单TCP套接字。我从字符串(XML)发送数据作为字节。 Java和C#代码都在同一主机上运行。数据通过localhost发送。

每个其他消息,C#应用程序响应错误,指示格式错误的XML。商业团队和我都为什么感到困惑。在调试器中,记录我发送的XML是有效的。但是,一旦它到达C#端;将一个或两个字符添加到XML声明中。

我们在日志中找到了什么:

 Expected
 <?xml version="1.0" encoding="ISO-8859-1" ?>

 Observed
 <?xml version="1.0" encoding="ISO-8859-M1" ?>
 <?xml oversion="1.0" encoding="ISO-8859-1" ?>
 <?=xml version="1.0" encoding="ISO-8859-1" ?>

我正在使用类似Java的东西发送到C#应用程序。

String request = "Whatever";
Socket clientSocket = new Socket(Host, Port);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()) ;
outToServer.writeBytes(request + '\n');

C#应用程序正在从线路接收数据,如下所示。

TcpClient tcpClient = (TcpClient)client;
NetworkStream networkStream = null;
byte[] array = new byte[tcpClient.ReceiveBufferSize];
string text = "";
this.lastTouched = DateTime.Now;
try
{
    networkStream = tcpClient.GetStream();
    do
    {
        int count = networkStream.Read(array, 0, array.Length);
        text += Encoding.ASCII.GetString(array, 0, count);
    }

我有一种感觉,我们都在这里犯错误;但它适用于具有相同代码的其他系统,我认为这是巧合。我们只是看到一个边缘案例。

思想?

1 个答案:

答案 0 :(得分:1)

不要使用DataOutputStream,而是使用该类而不是序列化,只要我理解,您就发送一个原始字符串。尝试直接使用OutputStream:

 // for this to use the UTF-8 encoding in <?xml version="1.0" encoding="UTF-8" ?>
clientSocket.getOutputStream().write(request.getBytes("UTF8"));

您需要使用在getBytes(...)中指定的编码以及XML文件中使用的编码<?xml version="1.0" encoding="..." ?>

在C#部分:

你确定字符串中的所有字符都是ASCII(你没有像Ñ这样的字符)吗?自从我上次用C#编写内容以来它已经很久了,但似乎你使用ASCII来解码字符串,是不是更适合使用其他编码?