こんばんは、
奇妙な問題があります。私は 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 からソケット サーバーへのメッセージの送信はうまく機能します。しかし、問題があります。ae "Message Test" を送信すると、最初の Debug.WriteLine(szData) で文字が正しくログに記録されます。(byte は byte[1] に設定されているため、バイトごとに関数が呼び出されます)。ただし、szData を stringVar プロパティに追加すると、正しく機能しません。Debug.WriteLine(stringVar) は常に最初の文字のみをログに記録します。私の例では、('Message Test' ではなく) '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;