【问题标题】:Sending bytes over network on a device在设备上通过网络发送字节
【发布时间】:2015-10-08 09:03:03
【问题描述】:

我正在尝试通过使用网络流 (tcp/ssl) 将一些字符串(ascii)写入服务器,即本地 C# 控制台应用程序。代码如下所示:

public void SendMessage(String message) throws IOException {
   OutputStream stream = client.getOutputStream();
   // message is a String of 27 characters.
   stream.write(message.getBytes("US-ASCII"), 0, message.getBytes("US-ASCII").length);
   stream.flush();
}

这在模拟器上运行良好,但是,当我在我的设备上运行应用程序(Lolipop 5.0.2 上的 Galaxy A5)时,它只发送一个字节。这里有什么问题?

我在服务器端接收代码,我首先尝试读取前四个字节(C#):

var messageData = new StringBuilder(); 
var buffer = new byte[4]; 
var bytes = sslStream.Read(buffer, 0, 4); 
var len = Encoding.ASCII.GetString(buffer); 
var chars = new char[Encoding.ASCII.GetCharCount(buffer, 0, bytes)]; 
// Use Decoder class to convert from bytes to ACII 
// in case a character spans two buffers. 
Encoding.ASCII.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);

【问题讨论】:

  • 尝试使用Writer,但请在套接字的整个生命周期内使用同一个。很难相信它只发送一个字节,除非消息只有一个字节。您是否考虑过问题出在接收端的可能性?
  • 不,因为我也在调试服务器应用程序。当从模拟器运行相同的消息时,我收到 4 个字节,而在设备上它收到一个字节。
  • 所以? TCP 完全有权一次传送一个字节。你必须循环。您必须发布您的接收代码。
  • 我的接收代码(C#): var messageData = new StringBuilder(); var 缓冲区 = 新字节 [4]; var bytes = sslStream.Read(buffer, 0, 4); var len = Encoding.ASCII.GetString(buffer); var chars = new char[Encoding.ASCII.GetCharCount(buffer, 0, bytes)]; // 使用解码器类将字节转换为 ACII // 以防一个字符跨越两个缓冲区。 Encoding.ASCII.GetChars(buffer, 0, bytes, chars, 0); messageData.Append(chars);
  • 我总是收到前四个字节,这是消息其余部分的长度。

标签: java c# android networking


【解决方案1】:

尝试使用标准的 StandardCharsets.US_ASCII 而不是硬编码的字符串,这总是一个坏主意。

yourString.getBytes(StandardCharsets.US_ASCII);

【讨论】:

  • 为什么这个问题我收到-1,因为我没有答案?
  • @Brght 为什么你在这个问题上收到 -1 与这个答案无关。你从我那里得到了-1,因为你的问题还没有意义,尽管我多次尝试让你澄清它。
  • 我不同意你的看法。我准确地解释了我的问题。
  • 你还没有得到答案。很奇怪,不是吗?
  • 这意味着我没有正确询问或没有人知道答案?
猜你喜欢
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2010-12-06
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多