【问题标题】:Receive incomplete/wrong string over TCP通过 TCP 接收不完整/错误的字符串
【发布时间】: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 包含从您发送的内容末尾开始的一些随机字节数。

标签: c# android tcp


【解决方案1】:

我找到了解决办法。

这是现在的客户端代码:

class MyServerThread implements Runnable {

    @Override
    public void run() {
        try {
            ServerSocket ss = new ServerSocket(50000);
            while (true) {
                Socket  s = ss.accept();
                InputStream is = (s.getInputStream());

                BufferedReader r = new BufferedReader(new InputStreamReader(is));
                StringBuilder total = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    total.append(line);
                }
                message = total.toString();

                s.close();
                is.close();

                    if (message.equals("Connection OK!")) {
                        createIP();
                    } else {
                        createPic();
                    }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2019-10-25
    相关资源
    最近更新 更多