【问题标题】:Visual C# - String append to String not working correctlyVisual C# - 字符串附加到字符串无法正常工作
【发布时间】:2012-05-04 18:09:40
【问题描述】:

晚上好,

我有一个奇怪的问题。我对 Visual C# 不是很熟悉,但是我需要编写一个小套接字应用程序来启用与 iOS 应用程序的通信。 请在下面查看我每次收到数据时触发的函数。

public void onDataReceived(IAsyncResult asyn)
    {
        // Debug.WriteLine("Receiving Data");
        try
        {
            CSocketPacket socketId = (CSocketPacket)asyn.AsyncState;
            int iRx = 0;
            iRx = socketId.thisSocket.EndReceive(asyn);
            char[] chars = new char[iRx + 1];
            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(socketId.dataBuffer, 0, iRx, chars, 0);
            System.String szData = new System.String(chars);
            Debug.WriteLine(szData);
            stringVar += szData;
            Debug.WriteLine(stringVar);
            szData = "";
            startWaitingForData(socketWorker);
        }
        catch (ObjectDisposedException)
        {
            Debugger.Log(0, "1", "\n onClientConnection: Socket has been closed!\n");
        }
        catch (SocketException error)
        {
            Debugger.Log(0, "1", error.ToString());
        }
    }

从 iphone 向套接字服务器发送消息效果很好。但是有一个问题。如果我发送 a.e. “消息测试”第一个 Debug.WriteLine(szData) 正确记录字符。 (字节设置为字节[1],因此对于每个字节,函数都会被调用)。但是,如果我将 szData 附加到我的 stringVar 属性,它将无法正常工作。 Debug.WriteLine(stringVar) 将始终只记录第一个字符,在我的示例中它将记录“MMMMMMMMMMMM”(而不是“消息测试”)

不确定我在这里缺少什么。任何帮助都非常感谢。

谢谢你:)

更新: 在我的 startWaitingForData 函数下方:

public class CSocketPacket
    {
        public System.Net.Sockets.Socket thisSocket;
        public byte[] dataBuffer = new byte[1];
    }

    public void startWaitingForData(System.Net.Sockets.Socket soc)
    {
        // Debug.WriteLine("Start waiting for data");
        try
        {
            if (workerCallBack == null)
            {
                workerCallBack = new AsyncCallback(onDataReceived);
            }
            CSocketPacket socketPacket = new CSocketPacket();
            socketPacket.thisSocket = soc;
            soc.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, workerCallBack, socketPacket);
        }
        catch (SocketException error)
        {
            Debugger.Log(0, "1", error.ToString());
        }
    }

对于 iphone 部分,我使用 ASCII 编码:

NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSASCIIStringEncoding]];

stringVar 定义为:

private string stringVar;

【问题讨论】:

  • 听起来很奇怪 - 字符串连接肯定确实在 .NET 中工作,所以不清楚哪里出了问题。 (最好使用StringBuilder 而不是重复的字符串连接,但那是另一回事。)你能展示一个简短但完整 的程序来说明问题吗? (另外,我强烈建议遵循 .NET 命名约定。)
  • 我认为我们需要查看stringVarstartWaitingForData 的定义,因为这似乎与它们的使用方式有关。
  • 我也尝试过 StringBuilder,结果相同

标签: c# string sockets append


【解决方案1】:

我认为需要更多信息才能深入了解。

但是,iPhone 发送的是什么编码?

另外,请注意 iRx 会为您提供读取的字节数,但这并不一定等于读取的字符数,因为 UTF8 是一种多字节编码。

根据MSDN,您应该使用 GetCharCount 方法来获取您需要将数组大小设置为的字符数。

编辑:@Pascal 更新后

根据 Skeet 先生的评论,如果没有完整的版本来调试它,只能猜测问题所在。另外,您对

的初始描述

如果我发送 a.e. “消息测试”第一个 Debug.WriteLine(szData) 正确记录字符

如果您一次只发送一个字节,似乎不正确?

我会建议以下作为尝试修复:

  • 将缓冲区大小从 1 个字节增加到更合理的值,例如 256。您是否有任何理由强制它一次执行 1 个字节?
  • 您的 onDataReceived 处理程序调用了您的 startWaitingForData 并且然后执行 BeginRecieve,因此您有一个递归元素;确保在接收之间重置局部变量等。

请注意,如果您的服务器编码是 UTF8,那么您的 iPhone 客户端确实应该使用 UTF8。

【讨论】:

    【解决方案2】:

    你总是只读取socketId.dataBuffer的第一个字节吗?

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2021-10-31
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多