2012-04-24 114 views
2

晚上好,Visual C# - 字符串追加到字符串無法正常工作

我有一個奇怪的問題。我對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'(而不是'Message Test')

不知道我在這裏丟失了什麼。任何幫助是真正的讚賞。

謝謝:)

UPDATE: 下面我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; 
+2

聽起來很奇怪 - 字符串連接肯定不會*在.NET中工作,所以不清楚是什麼問題。 (最好使用StringBuilder而不是重複的字符串連接,但這是另一回事。)您能否顯示一個簡短但完整的程序來展示問題? (另外,我強烈建議遵循.NET命名約定。) – 2012-04-24 06:04:47

+0

我認爲我們需要看到'stringVar'和'startWaitingForData'的定義,因爲這似乎與它們的使用方式有關。 – yamen 2012-04-24 06:17:21

+0

我也嘗試過StringBuilder以及相同的結果 – Pascal 2012-04-24 13:49:20

回答

1

我認爲需要更多信息才能瞭解這一點。

但是,iPhone發送的是什麼編碼?

此外,請注意,iRx會給你讀取的字節數,但這並不等於讀取的字符數,因爲UTF8是一個多字節編碼。

根據MSDN您應該使用GetCharCount方法來獲取您需要設置數組大小的字符數。

編輯:@Pascal UPDATE

按飛碟雙向先生的評論,沒有一個完整的版本,調試之後,這只是猜測作爲工作的問題是什麼。此外,您的初始描述

如果我發送a.e. 「消息測試」第一個Debug.WriteLine(szData)正確記錄字符

似乎並不正確,如果你一次只發送一個字節?

我建議以下爲嘗試解決:

  • 從1個字節的東西更明智像256增加您的緩衝區大小,是否有你正迫使它在做這1個字節的任何原因時間?
  • 您有一個遞歸元素,因爲您的onDataReceived處理程序調用您的startWaitingForData,然後執行BeginRecieve;確保您重置接收之間的本地變量等。

請注意,如果這是您的服務器的編碼,您的iPhone客戶端應該真的使用UTF8。

0

您是否只總是讀取socketId.dataBuffer的第一個字節?