下面是C#编的服务端的发送和接收消息的代码:
 #region 02负责监听客户端发送来的消息
        void RecMsg()
        {
            while (isRec)
            {
                try
                {
                    byte[] arrMsg = new byte[1024 * 1024 * 2];
                    //接收 对应 客户端发来的消息
                    int length = sokMsg.Receive(arrMsg);
                    
                    //将接收到的消息数组里真实消息转成字符串
                    string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 1, length);
                    //string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
                    //string strMsg = null;
                    //strMsg += Encoding.UTF8.GetString(arrMsg, 0, length);
                    //if (strMsg.IndexOf("<EOF>") > -1) { break; }                    //通过委托 显示消息到 窗体的文本框
                    dgShowMsg(strMsg);
                }
                catch (Exception ex)
                {
                    isRec = false;
                    //从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象
                    dgRemoveConnection(sokMsg.RemoteEndPoint.ToString());
                }
            }
        } 
        #endregion        #region 03向客户端发送消息
        /// <summary>
        /// 向客户端发送消息
        /// </summary>
        /// <param name="strMsg"></param>
        public void Send(string strMsg)
        {
           byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
          //  byte[] arrMsg = System.Text.Encoding.ASCII.GetBytes(strMsg);
            byte[] arrMsgFinal = new byte[arrMsg.Length+1];            arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
            arrMsg.CopyTo(arrMsgFinal, 1);
            //arrMsg.CopyTo(arrMsgFinal,0);
            sokMsg.Send(arrMsgFinal);
            //sokMsg.Send(arrMsg);
        } 
        #endregion下面是QT编的客户端的发送和接收消息的代码:
void Widget::readMessage(){    QDataStream in(tcpSocket);
    
    
    
  if(blockSize==0) //如果是刚开始接收数据    {        //判断接收的数据是否有两字节,也就是文件的大小信息        //如果有则保存到blockSize变量中,没有则返回,继续接收数据        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;        in >> blockSize;
    }    if(tcpSocket->bytesAvailable() < blockSize)
        return;    //如果没有得到全部的数据,则返回,继续接收数据in>>message;    ui->messageLabel->setText(message);
            printf("message==%s", message.toAscii().data());    //显示接收到的数据}
void Widget::sendMessage(){
        QByteArray block;
        QDataStream out(&block, QIODevice::WriteOnly);
         sendString = tr("hello server!");
        out << (quint16)0;
        out << sendString;
        out.device()->seek(0);
        out << (quint16)(block.size() - sizeof(quint16));     
        tcpSocket->write(block);
        //QTcpSocket *clientConnection = tcpSocket;
            //我们获取已经建立的连接的子套接字        
            ui->statusLabel->setText("send message successful!!!");} 
服务端发送数据正常,但是客户度发送数据时,我断点调试服务器发现他也接的到的那个strMsg=“\0\0\0\0\0->\0h\0e\0l\0l\0o\0 \0s\0e\0r\0v\0e\0r\0!” 翻译成16进制就是:00 1E 00 00 00 1A 00 68 65 00 6C 00 6F 00 20 00 73 00 65 00 72 00 76 00 65 72 00 21 00 00 00
这样的话,我服务端就不能正常显示接收到的数据了嘛,遇到\0后面就都没了。经过我分析觉得是编码传输和解码接收的问题,那个QDataStream不是很懂,也是写流的,C#用的是steam。两者的操作符就不同。想最简单的办法就是把strMsg里的数据进行转换成68 65 6C 6F 20 73 65 72 76 65 72 21 00就好了,求教大师,本人整了好久了还是依然不行。最好有高手的话帮我把两个平台的编码转换和接收统一了,谢谢有耐心看到这里的热心人!

解决方案 »

  1.   

    string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 1, length);
                        //string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
                        //string strMsg = null;
                        //strMsg += Encoding.UTF8.GetString(arrMsg, 0, length);
                        //if (strMsg.IndexOf("<EOF>") > -1) { break; }
    你这里不要用字符串转换的办法了。
    得到byte的数组后,使用for循环,每个一个数据取一个就好了。
    然后组成你要的编码就行了。 
    另外utf8是3个字节编码的,你的这个数据应该是2个字节编码的,估计不是utf8.
    你用Default试试吧System.Text.Encoding.Default.GetString(arrMsg);
      

  2.   

    谢谢各位好心人,成功了,那个编码是UTF8的。