java - 通过原始套接字编码字符串 - 额外字符

标签 java c# xml sockets character-encoding

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

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

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

我觉得我们都在这里犯了错误;但它可以在具有相同代码的其他系统上运行,我认为这是巧合。我们只是看到了一种边缘情况。

想法?

最佳答案

不要使用 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 来解码字符串,使用其他编码不是更合适吗?

关于java - 通过原始套接字编码字符串 - 额外字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524060/

相关文章:

java - 如何显示 ArrayList 中除一个元素以外的所有元素?

Java renameTo Files Showed 0 File Size 然后消失了......Windows仍然保留空间

c# - Monitor.Wait,条件变量

java - XML Android 与 Html 5 性能和关注点?

java - 读取文件时特定位置的特定字符的索引

java - Mac OS 上的加密/解密错误

c# - 在 ASP.NET MVC 中设置流功能

c# - 通过 app.config 配置线程池最大线程数?

jquery - 在 jQuery 中处理 xml 命名空间

python - SUDS:在 Client.service 方法中传递数组参数:GAE Python