关于用symbian中的TCP / IP写入

时间:2009-05-28 07:46:24

标签: c++ symbian

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中的纯文本兼容吗?

2 个答案:

答案 0 :(得分:1)

TDes8只是字节,如果Java端试图读取ASCII,这很好,如果Java端期望16位unicode(这就是Java的char),那就没那么好了。但是如果你在另一端读取套接字,那么即使它不兼容,你仍然会看到一些数据,而不是你所期望的。您与服务器通信的协议应指定字符集,而不管服务器实现的语言是什么。

否则:

  • 它是否可以在模拟器上运行?
  • 您是否检查过iStatus是否有错误?通常情况下,如果套接字连接,你可以写信给它,但你永远不会知道。
  • 服务器是否报告套接字已连接?您可能已连接到错误的主机或错误的端口。
  • 如果服务器确实读了一些数据,但由于某种原因失败了,你知道吗?我想我也在问你是否正在调试另一端。如果没有,那么您的数据可能不是正确的格式,而在另一端则被忽略。我想你正在发送6146A<?xml version="1.0"?><AM><P/><A><CE/></A></AM>。一些跟踪和/或数据包嗅探会告诉您这是否属实。
  • 以“a”开头的变量通常是一个参数:这是您的真实代码吗?如果没有,那么关于格式错误的数据的事情就适用了,而你的调用者可能会给你错误的东西。
  • 您可能希望在返回之前使用PopAndDestroy aQuery,尽管这不会影响此问题。
  • 你的函数应该被称为WriteSocketL,因为它可以离开。

答案 1 :(得分:1)

来自重复问题的交叉发布回复:

您的移动网络运营商可能阻止任何非HTTP流量。

您的服务器可能需要在返回所有数据之前接收更多数据。

我还特别关注你使用java字符/字符串,因为我希望服务器上的低级java套接字将传入的网络数据放在byte []中,而不是String。如果您的服务器使用类似于对readLine()方法的调用,则可能需要在客户端发送的数据中添加回车符。