使用socket在Linux服务器和客户端之间传输数据并图形化显示数据变化

概要

  最近项目使用rk3588采集icm42688陀螺仪数据上传到服务端进行分析。

整体架构流程

 socket代码流程

1.在服务器上采集数据,并将其存储在一个缓冲区中。
2.创建一个socket并将其绑定到服务器的IP地址和端口号上,以便客户端可以连接到该socket。
  需要使用bind()函数来绑定socket,并使用listen()函数设置socket的最大连接数。
3.当客户端连接到socket时,需要使用accept()函数接受连接,并创建一个新的socket用于与
  该客户端通信。
4.将数据从服务器发送到已连接的客户端。可以使用send()函数来发送数据。
5.当需要关闭连接时,需要使用close()函数关闭socket。

 X11 :一个图形窗口系统

  X11 是一个图形窗口系统,也是 Linux/Unix 系统中最常用的窗口系统之一。它提供了一种在图形界面下创建和管理程序窗口的方式,并且可以以客户端/服务器模式工作,允许程序在远程计算机上显示其图形界面。使用 X11 库,可以在 Linux/Unix 系统中创建图形界面应用程序。这些应用程序可以包含各种 GUI 元素,如窗口、按钮、文本框、菜单等。X11 库还支持绘制 2D 图形,如直线、矩形、圆形等,以及显示图片和视频。除此之外,X11 库还支持多种输入设备,如鼠标、键盘、触摸屏等,使得程序可以响应用户的交互操作。

局部代码示例

客户端显示窗口代码

    dpy  =  XOpenDisplay((0)); /*使用 XOpenDisplay 函数打开一个与 X 服务器的连接,并返回连接对象 dpy */
    win  =  XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0,0, xx, yy, 0,0,0);/*使用 DefaultRootWindow 函数获取默认屏幕的根窗口,并将其作为父窗口。使用 XCreateSimpleWindow 函数创建一个简单的窗口*/
    XSelectInput(dpy, win, StructureNotifyMask);/*使用 XSelectInput 函数设置窗口感兴趣的事件类型,这里设置为特定类型的通知事件*/
    XMapWindow(dpy, win);/*使用 XMapWindow 函数将窗口映射到显示器上,使其可见。*/
    gc  =  XCreateGC(dpy, win, 0, (0));
    XSetForeground(dpy,gc,0);/*使用 XSetForeground 函数设置前景色,这里设置为 0,即黑色*/

服务端简单代码示例

#define PORT 8080

int main() {
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    char *hello = "Hello from server";

    // 创建socket文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置socket选项:允许地址重用
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    // 设置socket地址
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // 绑定socket
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听socket
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 等待客户端连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 发送数据到客户端
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent\n");
 }

发送数据代码

int sendServer(char *data,int len)
{
    send(new_socket, data, len, 0);
    return 0;
}

接收代码

 while(1)
    {
	    valread = read(client_fd, buffer, 64); // 1024
	    ........
	}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值