晚上好,
我有一个奇怪的问题。我对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)将始终只记录第一个char,在我的示例中它将记录'MMMMMMMMMMMM'(而不是'Message Test')
不确定我在这里缺少什么。真的很感激任何帮助。
谢谢:)
更新: 在我的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;
答案 0 :(得分:1)
我认为需要更多信息才能深入了解这一点。
但是,iPhone发送的编码是什么?
另请注意,iRx会为您提供读取的字节数,但这并不一定等于读取的字符数,因为UTF8是一种多字节编码。
根据MSDN,你应该使用GetCharCount方法来获取你需要设置数组大小的字符数。
编辑:@Pascal UPDATE之后
根据Skeet先生的评论,如果没有完整的版本来调试这个问题,那只能猜测问题是什么。另外,您最初的描述
如果你一次只发送一个字节,如果我发送a.e. “消息测试”第一个Debug.WriteLine(szData)正确记录字符
似乎不成立?
我建议修改以下内容:
请注意,如果这是服务器的编码,您的iPhone客户端应该使用UTF8。
答案 1 :(得分:0)
您是否始终只阅读socketId.dataBuffer
的第一个字节?