使用WebSocket和C语言实现一个简单的计算器

在现代Web开发中,WebSocket已经成为实时通信的重要工具。本文将介绍如何使用WebSocket与C语言结合,实现一个简单的计算器应用。我们将通过Go语言作为中间层,调用C语言编写的计算函数,并通过WebSocket与前端进行交互。

在使用本文章代码开发过程中遇到问题,可参考博主的另外两篇博客:

解决Go项目开发中遇到的问题(一)-CSDN博客文章浏览阅读647次,点赞23次,收藏10次。Go项目开发中遇到的问题以及对应的解决方案https://blog.csdn.net/qq_45519030/article/details/140202088

解决Go项目开发中遇到的问题(二)-CSDN博客文章浏览阅读660次,点赞17次,收藏20次。Go项目开发中遇到的问题以及对应的解决方案https://blog.csdn.net/qq_45519030/article/details/140203992

项目结构

我们的项目包含以下几个文件:

project/
├── calc.c
├── calc.h
├── client/
│   └── index.html
├── go.mod
├── go.sum
└── main.go

C语言部分

calc.h

#ifndef CALC_H
#define CALC_H
​
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);
​
#endif

calc.h 是一个头文件,定义了四个函数原型:addsubtractmultiplydivide。这些函数将用于执行基本的数学运算。

calc.c

#include "calc.h"
​
int add(int a, int b) {
    return a + b;
}
​
int subtract(int a, int b) {
    return a - b;
}
​
int multiply(int a, int b) {
    return a * b;
}
​
int divide(int a, int b) {
    if (b == 0) {
        return 0;
    }
    return a / b;
}

calc.c 文件实现了 calc.h 中定义的四个函数。每个函数分别执行加、减、乘、除运算。注意,在除法运算中,我们检查了除数是否为零,以避免除零错误。

Go语言部分

main.go

package main
​
import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)
​
// #cgo LDFLAGS: -L. -lcalc
// #include "calc.h"
import "C"
​
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}
​
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println("Failed to upgrade to WebSocket:", err)
        return
    }
    defer conn.Close()
​
    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("Read error:", err)
            break
        }
​
        var result int
        var op string
        var a, b int
        fmt.Sscanf(string(message), "%s %d %d", &op, &a, &b)
​
        switch op {
        case "add":
            result = int(C.add(C.int(a), C.int(b)))
        case "subtract":
            result = int(C.subtract(C.int(a), C.int(b)))
        case "multiply":
            result = int(C.multiply(C.int(a), C.int(b)))
        case "divide":
            result = int(C.divide(C.int(a), C.int(b)))
        default:
            result = 0
        }
​
        err = conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("%d", result)))
        if err != nil {
            fmt.Println("Write error:", err)
            break
        }
    }
}
​
func main() {
    http.HandleFunc("/ws", handleWebSocket)
    http.Handle("/", http.FileServer(http.Dir("./client")))
    fmt.Println("WebSocket server started at :8080/ws")
    fmt.Println("Static file server started at:8080")
    http.ListenAndServe(":8080", nil)
}

main.go 文件是Go语言编写的WebSocket服务器。主要功能如下:

  1. 导入必要的包:包括 fmtnet/httpgithub.com/gorilla/websocket

  2. 导入C语言库:通过 #cgo LDFLAGS#include "calc.h" 导入C语言编写的计算函数。

  3. 设置WebSocket升级器:使用 websocket.Upgrader 来处理WebSocket连接。

  4. 处理WebSocket连接:在 handleWebSocket 函数中,处理WebSocket连接的建立、消息的读取和发送。根据接收到的消息,调用相应的C语言函数进行计算,并将结果发送回客户端。

  5. 启动HTTP服务器:在 main 函数中,设置WebSocket处理函数和静态文件服务器,并启动HTTP服务器监听端口8080。

前端部分

client/index.html

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket计算器</title>
    <script>
        var socket = new WebSocket("ws://localhost:8080/ws");
​
        socket.onopen = function() {
            console.log("WebSocket connection opened");
            document.getElementById("status").innerText = "已连接";
        };
​
        socket.onmessage = function(event) {
            var result = event.data;
            document.getElementById("result").innerText = "计算结果是: " + result;
        };
​
        socket.onerror = function(error) {
            console.error("WebSocket error: " + error);
            document.getElementById("status").innerText = "错误!";
        };
​
        socket.onclose = function() {
            console.log("WebSocket connection closed");
            document.getElementById("status").innerText = "未连接!";
        };
​
        function sendOperation(op) {
            var a = document.getElementById("a").value;
            var b = document.getElementById("b").value;
​
            // 验证输入是否为数字
            if (isNaN(a) || isNaN(b)) {
                alert("请输入有效数字!");
                return;
            }
​
            socket.send(op + " " + a + " " + b);
        }
    </script>
</head>
<body>
    <h1>WebSocket计算器</h1>
    <div id="status">连接中...</div>
    <input type="number" id="a" placeholder="请输入有效数字A !">
    <input type="number" id="b" placeholder="请输入有效数字B !">
    <button onclick="sendOperation('add')">加</button>
    <button onclick="sendOperation('subtract')">减</button>
    <button onclick="sendOperation('multiply')">乘</button>
    <button onclick="sendOperation('divide')">除</button>
    <div id="result"></div>
</body>
</html>

index.html 文件是前端页面,主要功能如下:

  1. 建立WebSocket连接:通过 new WebSocket("ws://localhost:8080/ws") 建立与服务器的WebSocket连接。

  2. 处理WebSocket事件:包括连接打开、消息接收、错误处理和连接关闭事件。

  3. 发送操作:通过 sendOperation 函数,获取用户输入的两个数字,并根据用户选择的操作(加、减、乘、除)发送相应的消息到服务器。

  4. 显示结果:在接收到服务器返回的结果后,将其显示在页面上。

依赖管理

在项目目录中,运行以下命令来安装所需的Go模块依赖:

go mod tidy

这个命令会读取 go.mod 文件中的依赖声明,并自动下载这些依赖包。同时,它会生成或更新 go.sum 文件,该文件包含了依赖包的校验和,确保下载的依赖包是完整和安全的。

运行项目

1.编译C语言代码:

gcc -c calc.c -o calc.o
ar rcs libcalc.a calc.o

2.运行Go语言服务器:

go run main.go

3.访问

打开浏览器,访问链接:

​http://localhost:8080​

即可看到前端页面,输入数字并点击相应的按钮,即可进行计算。

项目在终端运行成功,会出现如下图所示的内容:

接下来我们通过浏览器访问 http://localhost:8080 ,内容如下图所示:

我们可以通过在输入框中输入需要计算的数据,再点击右侧的运算方式按钮,便可得到运算结果,如图所示:

如果觉得界面过于简陋,不好看,那么我们对这个界面进行一些调整,如下图所示:

更多优化细节请参考博主的下一篇文章!

对WebSocket计算器优化-CSDN博客对WebSocket计算器优化https://blog.csdn.net/qq_45519030/article/details/140226344

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装websocket-client和protobuf 首先需要安装websocket-client和protobuf两个库,可以使用pip进行安装: ``` pip install websocket-client protobuf ``` 2. 编写protobuf文件 定义一个简单的protobuf文件,名为`message.proto`,内容如下: ``` syntax = "proto3"; message Message { string content = 1; } ``` 然后使用`protoc`命令将其编译成Python代码: ``` protoc message.proto --python_out=. ``` 3. 编写客户端代码 使用websocket-client和protobuf库实现一个简单的客户端,连接到WebSocket服务器并发送和接收消息。 ```python import websocket import message_pb2 def on_open(ws): print('Connected to server') # 发送消息 message = message_pb2.Message() message.content = 'Hello, server!' ws.send(message.SerializeToString()) def on_message(ws, message): # 接收消息 message = message_pb2.Message() message.ParseFromString(message) print('Received message:', message.content) def on_close(ws): print('Disconnected from server') # 创建WebSocket连接 ws = websocket.WebSocketApp('ws://localhost:8000', on_open=on_open, on_message=on_message, on_close=on_close) # 开始监听WebSocket消息 ws.run_forever() ``` 4. 运行客户端 在命令行中运行客户端代码: ``` python client.py ``` 客户端将连接到WebSocket服务器并发送一条消息,然后等待接收服务器返回的消息。如果一切正常,客户端将输出类似以下内容: ``` Connected to server Received message: Hello, client! Disconnected from server ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值