【发布时间】: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