C#转安卓聊天客户端

标签 c# java android sockets xamarin

我使用 C# 创建了一个 LAN 聊天消息传递应用程序,它将运行该程序的所有客户端连接到我计算机上的服务器。

我现在正尝试通过 Xamarin Studio 将此应用程序转换为适用于 Android 设备。

测试时,设备会正确连接到服务器,因为它可以发送一条消息(表示设备已登录),然后将该消息广播给其他客户端。

但是,一旦应用程序发送此消息,程序就会立即关闭。

在聊天客户端的桌面版本中,我使用代码(在另一个线程上运行):

NetworkStream serverStream = default(NetworkStream);
private void getMessage()
    {
        while (this.keepOpen)
        {
            Console.WriteLine("getMessage");
            serverStream = clientSocket.GetStream();
            int buffSize = 0;
            byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
            buffSize = clientSocket.ReceiveBufferSize;
            try
            {
                Console.WriteLine("Read stream");
                serverStream.Read(inStream, 0, buffSize);
                Console.WriteLine ("Final test");
            }
            catch
            {
                Console.WriteLine("failed to read stream");
            }


            string returndata = Encoding.ASCII.GetString(inStream);
            readData = "" + returndata;
            message();
        }
    }

这在第一次调用时起作用,因为显示“最终测试”行。但是,在此之后,当该方法再次进入此阶段(因为它处于永无止境的循环中)时,我收到一条错误消息:

'[dalvikvm-heap] 将堆( fragment 情况)增加到 13.455MB 以分配 4194308 字节'

'[dalvikvm-heap] 将堆( fragment 情况)增加到 21.444MB 以分配 8388612 字节'

“最终测试”行没有显示,因此“serverStream.Read(inStream, 0, buffSize);”行正在崩溃应用程序。我曾尝试使用 .Flush() 和 .Close(),但这些都不起作用。

我的代码的发送部分使用“serverSocket.Write()”完美运行,因为其他客户端可以接收消息,那么为什么从服务器读取数据会使应用程序崩溃?

P.S 这是我的第一个 Android 应用程序,所以我想使用一种我更熟悉的语言,而不是尝试从头开始使用 Java。

提前致谢。

最佳答案

意识到这个错误是因为我在尝试发送消息时分配了太多内存。

简单的改变

byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
buffSize = clientSocket.ReceiveBufferSize;

byte[] inStream = new byte[4096];
buffSize = 4096;

关于C#转安卓聊天客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22939344/

相关文章:

c# - 默认按钮不适用于多个验证组

java - Lint 将 Kotlin MutableMap.forEach() 视为 java.util.Map.forEach()

java - Apache POI 无法替换空白 Excel 单元格

Java 'Date' 对象大小

java - 将字符串解析为 JSON

java - SeekBar - 无法设置起点

android - android 上的 ssl 奇怪问题

c# - 在 C# 中,线程如何返回到与它来自的位置不同的位置?

c# - 保护 .NET DLL 免受 CLI 修改

c# - 自定义配置文件重复用户信息