Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt服务器/Java客户端通信问题_Java_C++_Qt_Sockets - Fatal编程技术网

Qt服务器/Java客户端通信问题

Qt服务器/Java客户端通信问题,java,c++,qt,sockets,Java,C++,Qt,Sockets,我目前正在尝试在qt服务器和java客户端之间进行一点网络通信 在我的示例中,客户机希望向服务器发送一个映像。我现在的问题是,服务器从未看到数据,因此bytesAvailable()返回0 我已经尝试了QDataStream、QTextStream和readAll(),但仍然没有数据 服务器: QTcpServer* tcpServer; QTcpSocket* client; tcpServer = new QTcpServer(); if(!tcpServer->listen(QHo

我目前正在尝试在qt服务器和java客户端之间进行一点网络通信

在我的示例中,客户机希望向服务器发送一个映像。我现在的问题是,服务器从未看到数据,因此bytesAvailable()返回0

我已经尝试了QDataStream、QTextStream和readAll(),但仍然没有数据

服务器:

QTcpServer* tcpServer;
QTcpSocket* client;
tcpServer = new QTcpServer();

if(!tcpServer->listen(QHostAddress::Any, 7005)){
    tcpServer->close();
    return;
}
... 
tcpServer->waitforNewConnection();
client = tcpServer->nextPendingConnection();
client->waitForConencted();
while(client->state()==connected){
    // Syntax here might be iffy, did it from my phone
    if(client->bytesAvailable()>0){
    //do stuff here, but the program doesnt get here, since bytesAvailable returns 0;
}
}

客户:

    public SendPackage() {
    try {
        socket = new Socket(ServerIP, Port);
        socket.setSoTimeout(60000);
        output = new BufferedOutputStream(socket.getOutputStream());
        outwriter = new OutputStreamWriter(output);
    } catch (ConnectException e) {
        System.out.println("Server error, no connection established.");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void Send(BufferedImage img) {

    try {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(img, GUI.imageType, baos);
        baos.flush();
        byte[] imgbyte = baos.toByteArray();
        System.out.println(imgbyte.length);
        System.out.println("sending");

        outwriter.write(imgbyte.length);
        outwriter.flush();
        // here i'd send the image, if i had a connection ...
        output.flush();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
连接和一切都建立得很好,代码甚至告诉我在尝试发送时套接字何时断开,所以我想连接不是问题。 我刚开始使用Qt,所以如果你们知道为什么这不起作用,我很乐意尝试一下。

client->waitForConencted();
client->waitForConencted();

// At this point the client is connected, but it is likely that no data were received yet

client->waitForReadyRead(-1); // <- Add this

// Now there should be at least 1 byte available, unless waitForConencted or waitForReadyRead failed (you should check that)

if(client->bytesAvailable() > 0) {
    // ...
}
//此时客户端已连接,但可能尚未收到任何数据 客户端->waitForReadyRead(-1);//字节可用()>0){ // ... }
请注意,您不能期望所有数据同时到达。TCP流可以以任何方式分段,数据将以随机大小的片段接收。你必须重复等待和阅读,直到你收到所有的东西。这也意味着你必须知道你什么时候收到了所有的东西。因此,您需要知道有多少数据即将到来,或者以某种方式识别数据的结束。例如,您可以在数据传输后立即断开连接,或者先发送数据长度。取决于您的应用程序

还可以查看允许您异步处理读取的信号。

client->waitForConencted();
//此时客户端已连接,但可能尚未收到任何数据
客户端->waitForReadyRead(-1);//字节可用()>0){
// ...
}
请注意,您不能期望所有数据同时到达。TCP流可以以任何方式分段,数据将以随机大小的片段接收。你必须重复等待和阅读,直到你收到所有的东西。这也意味着你必须知道你什么时候收到了所有的东西。因此,您需要知道有多少数据即将到来,或者以某种方式识别数据的结束。例如,您可以在数据传输后立即断开连接,或者先发送数据长度。取决于您的应用程序


另外,请看一看允许您异步处理读取的信号。

实际上,我正在尝试在一个while(connected)循环中读取。我忘了提到这一点,而且服务器在实际应用程序后面的另一个线程中运行,所以计时不是问题。好了,那么您不需要考虑<代码> QueDe::Read yRead < /C>。但我的回答仍然有效——我认为你只是想过早地获得数据。只需添加
waitForReadyRead
,当它返回时,您应该会看到一些数据。谢谢!是的,这就是我的问题:实际上,我试图在一段时间内(连接)循环阅读。我忘了提到这一点,而且服务器在实际应用程序后面的另一个线程中运行,所以计时不是问题。好了,那么您不需要考虑<代码> QueDe::Read yRead < /C>。但我的回答仍然有效——我认为你只是想过早地获得数据。只需添加
waitForReadyRead
,当它返回时,您应该会看到一些数据。谢谢!是的,这就是我的问题:D