Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual C#-字符串附加到字符串时工作不正常_C#_String_Sockets_Append - Fatal编程技术网

Visual C#-字符串附加到字符串时工作不正常

Visual C#-字符串附加到字符串时工作不正常,c#,string,sockets,append,C#,String,Sockets,Append,晚上好, 我有个奇怪的问题。我对visualc不太熟悉,但是我需要编写一个小的socket应用程序来实现与iOS应用程序的通信。 请检查以下每次收到数据时触发的我的功能 public void onDataReceived(IAsyncResult asyn) { // Debug.WriteLine("Receiving Data"); try { CSocketPacket socketId = (CSocket

晚上好,

我有个奇怪的问题。我对visualc不太熟悉,但是我需要编写一个小的socket应用程序来实现与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向socket服务器发送消息非常有效。但是有个问题。如果我发送一个e.e.“消息测试”,那么第一个Debug.WriteLine(szData)会正确记录字符。(字节被设置为字节[1],因此每个字节调用函数)。但是,如果我将szData附加到stringVar属性,它将无法正常工作。WriteLine(stringVar)将始终只记录第一个字符,在我的示例中,它将记录'mmmm'(而不是'messagetest')

不知道我错过了什么。非常感谢您的帮助

谢谢:)

更新: 下面是我的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;

我认为需要更多的信息来弄清这个问题

然而,iPhone发送的是什么编码

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

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

编辑:在@Pascal更新之后

根据Skeet先生的评论,没有一个完整的版本来调试这个,它只是猜测问题是什么。还有,您对

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

如果一次只发送一个字节,似乎听起来不是真的

我建议采取以下措施来解决:

  • 将缓冲区大小从1字节增加到256字节。是否有任何原因迫使它一次执行一个字节的操作
  • 您有一个递归元素,即您的onDataReceived处理程序调用您的startWaitingForData,然后这就开始了Recieve;确保在接收之间重置局部变量等

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

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

听起来很奇怪-字符串连接在.NET中确实有效,所以不清楚出了什么问题。(最好使用
StringBuilder
而不是重复的字符串连接,但这是另一回事。)您能展示一个简短但完整的程序来演示这个问题吗?(另外,我强烈建议遵循.NET命名约定。)我认为我们需要了解
stringVar
startWaitingForData
的定义,因为这似乎与它们的使用方式有关。我也尝试了StringBuilder,得到了同样的结果