Visual C# - 追加到字符串的字符串无法正常工作

本文关键字:字符串 常工作 工作 追加 Visual | 更新日期: 2023-09-27 18:32:00

晚上好,

我有一个奇怪的问题。我对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向套接字服务器发送消息效果很好。但是有一个问题。如果我发送"消息测试",第一个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]];

字符串变量定义为:

private string stringVar;

Visual C# - 追加到字符串的字符串无法正常工作

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

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

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

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

编辑:更新后@Pascal

根据Skeet先生的评论,如果没有完整的版本来调试它,那么问题是什么只是猜测工作。 另外,您的初始描述

如果我发送"消息测试",第一个调试.WriteLine(szData)正确记录字符

如果您一次只发送一个字节,这似乎不是真的?

我建议尝试解决以下问题:

  • 将缓冲区大小从 1 字节增加到更合理的值,如 256。 有什么理由强迫它一次做这个 1 个字节吗?
  • 你有一个递归元素,因为你的onDataReceived处理程序调用你的startWaitingForData,然后这样做BeginRecieve; 确保在接收之间重置局部变量等。

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

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