Qt服务器/Java客户端通信问题
我目前正在尝试在qt服务器和java客户端之间进行一点网络通信 在我的示例中,客户机希望向服务器发送一个映像。我现在的问题是,服务器从未看到数据,因此bytesAvailable()返回0 我已经尝试了QDataStream、QTextStream和readAll(),但仍然没有数据 服务器: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
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