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

4

2 回答 2

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,因为它可以离开。
于 2009-05-28T09:51:06.960 回答
1

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

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

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

考虑到我希望服务器上的低级 Java 套接字将传入的网络数据放在字节 [] 中,而不是字符串中,我还特别担心您使用 java 字符/字符串。如果您的服务器正在使用类似调用 readLine() 方法的方法,您可能需要在客户端发送的数据中添加回车符。

于 2009-05-29T11:17:12.840 回答