void CSocket::WriteSocket()
{
TBuf8<2> KData (_L8("60"));
//RBuf8 KData;
RBuf8 aQuery;
aQuery.CleanupClosePushL();
aQuery.CreateL(100);
// <?xml version="1.0"?><AM><P/><A><CE/></A></AM>
_LIT8(KData1,"61");
//_LIT8(KData2,"20");
_LIT8(KData3,"A");
_LIT8(KData4,"<?xml version=\"1.0\"?><AM><P/><A><CE/></A></AM>");
TBuf8<100> buff,buff1;
buff.Copy(_L("<?xml version=\"1.0\"?><AM><P/><A><CE/></A></AM>"));
TInt len=buff.Length();
buff1.AppendNum(len);
aQuery.Append(KData1);
aQuery.Append(buff1);
// aQuery.Append(KData2);
aQuery.Append(KData3);
aQuery.Append(buff);
//iSocket.Send(KData,KExpeditedDataOpt,iStatus);
iSocket.Write((TDesC8)aQuery,iStatus);
User::WaitForRequest(iStatus);
}
我在 Symbian 上使用此代码与使用 Java 的服务器进行通信。
但问题是:数据没有到达服务器。它显示设备已成功连接。我在这段代码中做错了什么? TDes8 是否兼容 Java 中的纯文本?
最佳答案
TDes8 只是字节,如果 Java 端试图读取 ASCII,这很好,如果 Java 端期望 16 位 unicode(这是 Java 的 char 是什么),则不太好。但是,如果您正在读取另一端的套接字,那么即使它不兼容,您仍然会看到一些数据,只是不是您所期望的。与服务器通信的协议(protocol)应该指定字符集,而不管服务器是用什么语言实现的。
否则:
- 它可以在模拟器上运行吗?
- 您检查过 iStatus 是否有错误吗?通常,如果套接字连接,您可以写入它,但您永远不知道。
- 服务器是否报告套接字已连接?您可能连接到了错误的主机或错误的端口。
- 如果服务器确实读取了一些数据,但由于某种原因失败了,你知道吗?我想我是在问你是否也在调试另一端。如果不是,则可能是您的数据格式不正确,并且在另一端被忽略了。我想你要发送
6146A<?xml version="1.0"?><AM><P/><A><CE/></A></AM>
.一些跟踪和/或数据包嗅探会告诉您这是否属实。 - 以“a”开头的变量通常是一个参数:这是您的真实代码吗?如果不是,那么有关格式错误的数据的问题适用,并且您的调用者可能给您错误的信息。
- 您可能希望在返回之前 PopAndDestroy aQuery,尽管这不会影响此问题。
- 您的函数应该称为 WriteSocketL,因为它可以离开。
关于c++ - 关于在 symbian 中使用 TCP/IP 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919671/