• 6679阅读
  • 13回复

怎么才能把这数据write出去!! [复制链接]

上一主题 下一主题
离线succulent
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-02
— 本帖被 XChinux 执行加亮操作(2009-01-06) —
一段代码

1.QBuffer* buffer = new QBuffer(this);    //定义一个buffer
2.buffer->open(QIODevice::ReadWrite);//设置buffer属性
3.qint64 bytes = buffer->write(this->readall());//把socket里的所有内容写到buffer里
4.buffer->seek(buffer->pos() - bytes);    //回到buffer的起始处
5.    while (buffer->canReadLine())    //当buffer里的内容足够read的时候
    {
        QByteArray line = buffer->readLine();  //把buffer里的内容read出来
        write(line);                                                //写到socket里面去
                    }

这么执行的话,一切都没问题,从client向server发送随便一串字符,都能被server的buffer接受,并写入socket,再送回来
但是,如果想把write(line)改成写入自己定义的随便一串字符,怎么该呢,直接用
write("xxxxxxxx")
或者write(s.toAsc())或者write(s.toLatin1())都不行,s是QString变量
谁更告诉我该怎么做,谢谢
离线magicrabit
只看该作者 1楼 发表于: 2008-12-02
建议你先把QString转化成Char类型,试试
char tmp[1024];           
sprintf(tmp,s.isEmpty()?"":text.toLocal8Bit().operator const char*());//其中s是QString
离线succulent
只看该作者 2楼 发表于: 2008-12-02
谢谢啊,我转化一下,不过第二句没怎么看懂,呵呵
离线succulent
只看该作者 3楼 发表于: 2008-12-02
char tmp[1024]="aaaaa";   
qDebug()<<tmp;       
write(tmp);

我直接定义了一个char 变量,然后写入,还是不行,不过qdebug可以打印出信息来
离线water_wf

只看该作者 4楼 发表于: 2008-12-03
因该没问题啊,贴段完整的代码吧,看看
离线succulent
只看该作者 5楼 发表于: 2008-12-03
引用第4楼water_wf于2008-12-03 09:02发表的  :
因该没问题啊,贴段完整的代码吧,看看

是啊,就是因为看不出什么破绽来,所以才郁闷无比

这是连接到slot的connect函数,当socket接受到readyread以后,就立即跳到slot
connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));


这是处理readyread的slot
void FortuneSocket::readClient()
    { 
      qDebug("5555555555555555");
//这是提示信息,到这里一点问题都没有
   
    QBuffer* buffer = new QBuffer(this);
    buffer->open(QIODevice::ReadWrite);
    qint64 bytes = buffer->write(this->readAll());
    buffer->seek(buffer->pos() - bytes);
    while (buffer->canReadLine())
    {
        QByteArray line = buffer->readLine();
        write(line);
        }

这是可以正常执行的代码,从客户端那里把信息读进来,然后再写回socket里,回送回到客户端,完全正常,客户端输入什么,马上就能读出来,并回去回去显示,一切ok

但是,当我打算读到客户端信息以后,比如客户端输入个“hello”,我想回应一句“omg”,而不是直接再把hello给送回去,我自己定义的这句死活没法写入,郁闷无比。

或者您能按照您的思路想想会怎么去写这句话吗,谢谢
离线water_wf

只看该作者 6楼 发表于: 2008-12-03
我感觉啊:
你的这个根本没执行,我记得:
    QBuffer* buffer = new QBuffer(this);//this 是个网络设备
    buffer->open(QIODevice::ReadWrite)这两句话作用是什么,打开这个设备
  qint64 bytes = buffer->write(this->readAll());写回网络设备
  你确定返回的不是这里写回去的,而是你下面while循环写回去的?
猜测而已。。最好调试一下
离线succulent
只看该作者 7楼 发表于: 2008-12-03
引用第6楼water_wf于2008-12-03 15:28发表的  :
我感觉啊:
你的这个根本没执行,我记得:
    QBuffer* buffer = new QBuffer(this);//this 是个网络设备
    buffer->open(QIODevice::ReadWrite)这两句话作用是什么,打开这个设备
  qint64 bytes = buffer->write(this->readAll());写回网络设备
.......

恩,谢谢,调试过了,我只留这三句,那么就无法再返回信息了
但如果保持原状,而把this给去掉,那么也一切正常
也就是说,buffer在这里仅仅是作为一个中间buffer而使用,最初的理解是没错的
离线succulent
只看该作者 8楼 发表于: 2008-12-03
    1                                    QByteArray line2("xxxxxx");
    2        QByteArray line = buffer->readLine();
    3        write(line2);
    4        write(line);

目前是这种情况,如果我这么写,那么client可以收到xxxxxx+(从client发送出去的数据)
但如果把2、4去掉,那么不行
如果把3去掉,也不行
离线water_wf

只看该作者 9楼 发表于: 2008-12-03
如果例子不大的,发个我帮你调试一下
离线succulent
只看该作者 10楼 发表于: 2008-12-03
引用第9楼water_wf于2008-12-03 16:24发表的  :
如果例子不大的,发个我帮你调试一下

程序倒是非常小,其实是我在一个很简单的chat的程序上做的改动
我发上来,谢谢你的帮忙
所有的关键代码全在chatserver的receiveMessage()这个slot里
就是想发送给客户端我自己所想发送的随便一些信息
很小的一个功能折腾了这么久,对信心确实有些打击,呵呵
描述:chat
附件: SimpleChat.rar (1166 K) 下载次数:7
离线water_wf

只看该作者 11楼 发表于: 2008-12-03
简单看了下,
确定因为少\n的缘故
connection->write(line);
connection->write("xxxxxx\n");
即可
离线succulent
只看该作者 12楼 发表于: 2008-12-04
谢谢,你帮了我很大的忙!!
但我发现,如果把foreach (QTcpSocket* connection, connections)这句去掉,也就是说不是每个socket口都给他遍历一遍,那还是不行,可能这里面有些诀窍我还没搞清楚,我再琢磨琢磨
非常感谢!!
离线water_wf

只看该作者 13楼 发表于: 2008-12-04
那你试着可以只发给sender() 啊
快速回复
限100 字节
 
上一个 下一个