【问题标题】:Can signed bytes be read from a stream?可以从流中读取带符号的字节吗?
【发布时间】:2014-06-15 19:53:45
【问题描述】:

我正在尝试将 java servlet 发送的字节读取到 C# 应用程序中,到目前为止,除了使用 C# 中的普通流从 servlet 中得到的信息外,我什么也得不到。我尝试了各种形式的解码,但还没有找到从 http 源将 sbytes 读入 c# 应用程序的有效方法。

servlet 字节与

一起发送

编辑的代码

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    ServletOutputStream resp = response.getOutputStream();
    try{
        resp.write("test".getBytes("UTF-8"));
    }
    catch(Exception e){
        //Do Nothing
    }

C# 读入

        try
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://path.to/servlet");
            req.Method = "POST";
            req.ContentType = "text/html";
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            string text;
            using (var reader = new StreamReader(resp.GetResponseStream()))
            {
                text = reader.ReadToEnd();
                Console.WriteLine(text);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

我最终得到两个问号或相同的两个 ascii 符号。

有人知道如何将这些 Java 字节流式传输到 C# 应用程序中吗?

【问题讨论】:

  • 似乎您的问题与编码未签名字节更相关。你试过Encoding.UTF8 吗?
  • "test".getBytes() 将给出相同的结果。只是说。
  • @L.B 谢谢,我试过 UTF8,除了我得到黑色菱形问号而不是两个 ascii 字符之外没有任何变化。

标签: java c# servlets stream


【解决方案1】:

两个问题:

  • 您在 C# 和 Java 中都使用平台默认编码。这几乎总是一个糟糕的选择。在 Java 中明确指定编码 - UTF-8 通常是一个不错的选择。 (这也是大多数 .NET 代码的默认设置。)
  • 您忽略了Stream.Read 的返回值;一般来说,您应该使用它来计算您实际收到了多少数据。然而,在这种情况下,使用StreamReader 会是一个非常更好的主意:

    string text;
    // Uses UTF-8 implicitly
    using (var reader = new StreamReader(httpResponse.GetResponseStream())
    {
        text = reader.ReadToEnd();
    }
    

Java 中字节的符号在这里无关紧要。

(另外,您为什么使用new String("test")?您认为仅使用"test" 会做什么?)

【讨论】:

  • 同样,如果没有像 StreamReaer 这样的类的帮助,使用返回值可能仍然会给出不正确的字符,因为 2 字节字符可能会在 read之间拆分>s
  • @L.B:是的。您可以直接使用Decoder,但StreamReader 会是更好的选择。
  • 我仍然收到两个菱形问号作为回复...我以更完整的形式发布了上面的更新代码,以查看是否遗漏了任何重要的内容并反映了您的建议变化。 (原来的字符串要复杂得多,当我从 Java 客户端切换到 C# 客户端时,我将其简化为“测试”,发现它不起作用。)
  • @user3344497:我建议你看看网络层面发生了什么。例如,响应可能被压缩。使用 Wireshark 查看网络流量。
猜你喜欢
  • 1970-01-01
  • 2011-11-01
  • 2014-04-08
  • 2015-07-26
  • 2018-07-28
  • 2021-08-03
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多