【发布时间】:2018-03-07 17:48:06
【问题描述】:
我的 TCP 客户端有问题。 我的 TCP 服务器将位图作为字符串发送到 TCP 客户端。目前每秒有 15 bmp。我的问题是,当我将接收到的字节数组转换为字符串时,它们中的大多数都被读作“//////....”。
我的 TCP 服务器代码是 (C#):
private void StreamWriter(byte[] writeMessage)
{
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse(Ip), Port);
NetworkStream streamSender = client.GetStream();
streamSender.Write(writeMessage, 0, writeMessage.Length);
streamSender.Flush();
streamSender.Close();
client.Close();
}
private void sendImage()
{
while (send)
{
MemoryStream mem = new MemoryStream();
image.Save(mem, System.Drawing.Imaging.ImageFormat.Bmp);
mem.Close();
mem.Dispose();
StreamWriter(Encoding.ASCII.GetBytes(Convert.ToBase64String(mem.ToArray())));
i++;
}
}
我的客户端代码是(Android Studio):
class MyServerThread implements Runnable {
@Override
public void run() {
try {
ServerSocket ss = new ServerSocket(50000);
while (true) {
Socket s = ss.accept();
InputStream is = (s.getInputStream());
BufferedInputStream bufferedReader = new BufferedInputStream(is);
byte[] contents = new byte[440000];
int bytesRead = 0;
while ((bytesRead = bufferedReader.read(contents)) != -1) {
message = new String(contents, 0, bytesRead);
}
is.close();
bufferedReader.close();
if (message.equals("Connection OK!")) {
createIP();
} else {
createPic();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
15 bmp per second.什么是bmp? -
@greenapps 可能是位图
-
@greenapps bmp 是 Bitmap 的快捷方式,表示服务器每秒将 15 个 Bitmap 转换为一个字符串。
-
你能收到其中一个好吗?为什么要同时开始这么多。我在您的代码中看不到任何表示 base 64 编码图像的内容。
-
我不懂java,但我想这是每天都会在这个网站上发布的常见问题。 TCP 数据可能以块的形式到达,没有“消息”或“片段”的概念(例如在 UDP 中)。因此,如果您发送了 2000 个字节,则
bufferedReader.read的第一次迭代可能会读取例如 1000 个字节,然后第二次读取 500 个字节(覆盖message),然后第三次读取 500 个以上(再次覆盖message)。结果 - 您的message包含从您发送的内容末尾开始的一些随机字节数。