我正在开发一个基于套接字接口的树莓派应用程序。主要思路是将树莓派连接到传感器,收集数据并通过WiFi发送到Android设备。从Android设备上,我可以发送一些命令与传感器进行通信。我是这种开发的初学者,正在按照QTcpSocket的一些教程创建一个简单的客户端-服务器应用程序,但它只能实现单向通信。服务器只监听客户端所发送的内容。你能帮助我改进成双向通信吗?我已经阅读了QTcpSocket不需要线程来解决这种问题,但我没有找到任何解决方案。
我会非常感激任何帮助!
server.cpp:
我会非常感激任何帮助!
server.cpp:
#include "server.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <cstdio>
#include <QtDebug>
Server::Server(QObject *parent) :
QObject(parent)
{
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()),
this, SLOT(on_newConnection()));
}
void Server::listen()
{
server->listen(QHostAddress::Any, 5100);
}
void Server::on_newConnection()
{
socket = server->nextPendingConnection();
if(socket->state() == QTcpSocket::ConnectedState)
{
printf("New connection established.\n");
qDebug()<<socket->peerAddress();
}
connect(socket, SIGNAL(disconnected()),
this, SLOT(on_disconnected()));
connect(socket, SIGNAL(readyRead()),
this, SLOT(on_readyRead()));
}
void Server::on_readyRead()
{
while(socket->canReadLine())
{
QByteArray ba = socket->readLine();
if(strcmp(ba.constData(), "!exit\n") == 0)
{
socket->disconnectFromHost();
break;
}
printf(">> %s", ba.constData());
}
}
void Server::on_disconnected()
{
printf("Connection disconnected.\n");
disconnect(socket, SIGNAL(disconnected()));
disconnect(socket, SIGNAL(readyRead()));
socket->deleteLater();
}
client.cpp
#include "client.h"
#include <QTcpSocket>
#include <QHostAddress>
#include <cstdio>
Client::Client(QObject *parent) : QObject(parent)
{
socket = new QTcpSocket(this);
printf("try to connect.\n");
connect(socket, SIGNAL(connected()),
this, SLOT(on_connected()));
}
void Client::on_connected()
{
printf("Connection established.\n");
char buffer[1024];
forever
{
while(socket->canReadLine())
{
QByteArray ba = socket->readLine();
printf("from server: %s", ba.constData());
}
printf(">> ");
gets(buffer);
int len = strlen(buffer);
buffer[len] = '\n';
buffer[len+1] = '\0';
socket->write(buffer);
socket->flush();
}
}
void Client::connectToServer()
{
socket->connectToHost(QHostAddress::LocalHost, 5100);
}
if(socket->canReadLine()){
QByteArray ba = socket->readLine();
printf(">> %s\n", ba.constData());
char buffer[] = "server to client";
socket->write(buffer);
}
问题在于当我只想从客户端向服务器发送响应时,应用程序会停止并等待来自客户端和readyRead()的数据。我猜我应该将服务器端的写入移到其他地方。最好的地方在哪里? - Krzysztof Jackowski