以下是一个简单的示例代码,演示了如何使用Linux C语言编写服务器,并使用QT C++编写客户端进行TCP通信。

服务器端代码(server.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sqlite3.h>
#include <json-c/json.h>

#define PORT 8080
#define DATABASE 'database.db'

// 回调函数,用于处理查询结果
int callback(void *data, int argc, char **argv, char **azColName) {
    // 解析查询结果
    int uid = atoi(argv[0]);
    char *device_name = argv[1];
    char *device_state = argv[2];
    char *value = argv[3];

    // 进行分析得出建议
    char suggestion[100];
    if (strcmp(device_name, '空调') == 0 && atoi(value) < 24) {
        strcpy(suggestion, '空调温度过低,建议提高温度至26℃');
    } else if (strcmp(device_name, '加湿器') == 0 && (atoi(value) < 40 || atoi(value) > 70)) {
        strcpy(suggestion, '加湿器湿度过高或过低,建议调整加湿器湿度');
    } else {
        strcpy(suggestion, '无建议');
    }

    // 将建议发送给客户端
    int client_sock = *(int *)data;
    char response[100];
    sprintf(response, '{\"suggestion\":\"%s\" }', suggestion);
    send(client_sock, response, strlen(response), 0);

    return 0;
}

int main() {
    int server_sock, client_sock, recv_len;
    struct sockaddr_in server_addr, client_addr;
    char buffer[1024];

    // 创建服务器套接字
    server_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (server_sock < 0) {
        perror('Failed to create socket');
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 绑定套接字到服务器地址
    if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror('Failed to bind socket');
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_sock, 5) < 0) {
        perror('Failed to listen');
        exit(EXIT_FAILURE);
    }

    printf('Server started, waiting for connections...
');

    while (1) {
        // 接受客户端连接
        socklen_t client_len = sizeof(client_addr);
        client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_len);
        if (client_sock < 0) {
            perror('Failed to accept connection');
            exit(EXIT_FAILURE);
        }

        printf('Client connected: %s:%d\n', inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        // 接收JSON数据
        recv_len = recv(client_sock, buffer, sizeof(buffer), 0);
        if (recv_len > 0) {
            buffer[recv_len] = '\0';
            printf('Received JSON data: %s\n', buffer);

            // 解析JSON数据
            struct json_object *json, *userid_json;
            json = json_tokener_parse(buffer);
            if (json_object_object_get_ex(json, 'userid', &userid_json)) {
                int userid = json_object_get_int(userid_json);

                // 连接数据库
                sqlite3 *db;
                if (sqlite3_open(DATABASE, &db) == SQLITE_OK) {
                    char sql[100];
                    sprintf(sql, 'SELECT uid, device_name, device_state, value FROM Status WHERE uid = %d', userid);

                    // 查询数据库
                    char *errmsg;
                    if (sqlite3_exec(db, sql, callback, &client_sock, &errmsg) != SQLITE_OK) {
                        fprintf(stderr, 'SQL error: %s\n', errmsg);
                        sqlite3_free(errmsg);
                    }

                    sqlite3_close(db);
                } else {
                    fprintf(stderr, 'Failed to open database: %s\n', sqlite3_errmsg(db));
                }
            }
        }

        close(client_sock);
        printf('Client disconnected\n');
    }

    close(server_sock);
    return 0;
}

客户端代码(client.cpp):

#include <QCoreApplication>
#include <QTcpSocket>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QDebug>

#define SERVER_IP '127.0.0.1'
#define SERVER_PORT 8080

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 创建TCP套接字
    QTcpSocket socket;
    socket.connectToHost(SERVER_IP, SERVER_PORT);
    if (!socket.waitForConnected()) {
        qDebug() << 'Failed to connect to server';
        return 1;
    }

    // 构建JSON数据
    QJsonObject json;
    json.insert('userid', 123);

    QJsonDocument doc(json);
    QByteArray data = doc.toJson();

    // 发送JSON数据
    socket.write(data);
    socket.waitForBytesWritten();

    // 接收服务器响应
    socket.waitForReadyRead();
    QByteArray response = socket.readAll();

    // 解析JSON响应
    QJsonParseError error;
    QJsonDocument responseDoc = QJsonDocument::fromJson(response, &error);
    if (error.error != QJsonParseError::NoError) {
        qDebug() << 'Failed to parse JSON response:' << error.errorString();
        return 1;
    }

    QJsonObject responseObject = responseDoc.object();
    QString suggestion = responseObject.value('suggestion').toString();

    qDebug() << 'Received suggestion:' << suggestion;

    return a.exec();
}

请注意,这只是一个简单的示例,仅演示了服务器和客户端之间的基本通信和JSON数据解析。您需要根据自己的需求进行修改和扩展。此外,您还需要安装SQLite和json-c库,并在编译时链接相应的库。

智能家居系统服务器与客户端TCP通信示例代码

原文地址: http://www.cveoy.top/t/topic/fB6j 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录