当前位置: 首页 > news >正文

go http启动应用程序

udpserver

udpserver 是go程序需要启动的程序

#include <iostream>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <thread>const int BUFFER_SIZE = 1024;int udpSocket;
struct sockaddr_in udpServerAddr, udpClientAddr;void udpServerThread() {socklen_t udpClientAddrLen = sizeof(udpClientAddr);char buffer[BUFFER_SIZE];while (true) {int n = recvfrom(udpSocket, buffer, BUFFER_SIZE, 0, reinterpret_cast<struct sockaddr*>(&udpClientAddr), &udpClientAddrLen);buffer[n] = '\0';std::cout << "Received from client: " << buffer << std::endl;sendto(udpSocket, buffer, n, 0, reinterpret_cast<struct sockaddr*>(&udpClientAddr), udpClientAddrLen);}
}int main() {// 创建 UDP 套接字udpSocket = socket(AF_INET, SOCK_DGRAM, 0);if (udpSocket < 0) {std::cerr << "Socket creation failed" << std::endl;return -1;}memset(&udpServerAddr, 0, sizeof(udpServerAddr));memset(&udpClientAddr, 0, sizeof(udpClientAddr));// 设置服务器地址信息udpServerAddr.sin_family = AF_INET;udpServerAddr.sin_addr.s_addr = INADDR_ANY;udpServerAddr.sin_port = htons(8081);// 绑定套接字到服务器地址if (bind(udpSocket, reinterpret_cast<const struct sockaddr*>(&udpServerAddr), sizeof(udpServerAddr)) < 0) {std::cerr << "Bind failed" << std::endl;return -1;}std::cout << "UDP server listening on port 8081..." << std::endl;// 启动 UDP 服务器线程std::thread serverThread(udpServerThread);// 主线程可以执行其他任务for (int i = 0; i < 10; ++i) {std::cout << "Main thread doing other task: " << i << std::endl;sleep(1);}// 等待 UDP 服务器线程结束(这里只是为了示例,实际应用中可能不会这样做)serverThread.join();close(udpSocket);return 0;
}

go示例程序

这是个比较简单的例子,启动go 的 http server以后立刻启动udpserver

package mainimport ("fmt""io""log""net/http""os/exec""strings"
)func handleRequest(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/restartUDP" {restartUDPServer()fmt.Fprintln(w, "UDP server restarted.")} else {fmt.Fprintln(w, "Hello, this is your HTTP server!")}
}func startUDPServer() {cmd := exec.Command("your_udp_server_executable_path")err := cmd.Start()if err!= nil {log.Fatal("Error starting UDP server:", err)}log.Println("UDP server started.")
}func restartUDPServer() {stopUDPServer()startUDPServer()
}func stopUDPServer() {// 根据实际情况确定如何停止 UDP 服务器进程,这里只是一个示例cmd := exec.Command("pkill", "your_udp_server_executable_name")err := cmd.Run()if err!= nil {log.Println("Error stopping UDP server:", err)}
}func main() {startUDPServer()http.HandleFunc("/", handleRequest)log.Println("Starting HTTP server on port 8080...")err := http.ListenAndServe(":8080", nil)if err!= nil {log.Fatal("Error starting HTTP server:", err)}
}

改进

改进上面的程序,启动以后发送udp给udpserver,这个代码在接收到/restartUDP的 HTTP 请求时,会重新启动 UDP 服务器,并发送一个测试消息给 UDP 服务器等待响应来确认启动成功。

package mainimport ("bufio""fmt""io""log""net""net/http""os/exec""sync""time"
)var udpConn net.Conn
var mutex sync.Mutexfunc handleRequest(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/restartUDP" {restartUDPServer()if waitForUDPServerResponse() {fmt.Fprintln(w, "UDP server restarted and response received.")} else {fmt.Fprintln(w, "UDP server restarted but no response received.")}} else {fmt.Fprintln(w, "Hello, this is your HTTP server!")}
}func startUDPServer() {cmd := exec.Command("your_udp_server_executable_path")err := cmd.Start()if err!= nil {log.Fatal("Error starting UDP server:", err)}log.Println("UDP server started.")var err errorudpConn, err = net.Dial("udp", "127.0.0.1:your_udp_port")if err!= nil {log.Fatal("Error connecting to UDP server:", err)}
}func restartUDPServer() {stopUDPServer()startUDPServer()
}func stopUDPServer() {mutex.Lock()if udpConn!= nil {err := udpConn.Close()if err!= nil {log.Println("Error stopping UDP server:", err)}udpConn = nil}mutex.Unlock()
}func waitForUDPServerResponse() bool {// 设置超时时间timeout := time.After(5 * time.Second)// 发送测试消息_, err := udpConn.Write([]byte("test"))if err!= nil {log.Println("Error sending UDP message:", err)return false}// 等待响应for {select {case <-timeout:return falsedefault:message, err := bufio.NewReader(udpConn).ReadString('\n')if err == nil && strings.TrimSpace(message)!= "" {return true}time.Sleep(100 * time.Millisecond)}}
}func main() {startUDPServer()http.HandleFunc("/", handleRequest)log.Println("Starting HTTP server on port 8080...")err := http.ListenAndServe(":8080", nil)if err!= nil {log.Fatal("Error starting HTTP server:", err)}
}
http://www.lryc.cn/news/421577.html

相关文章:

  • Redis:概念、部署、配置、优化
  • 华为OD-D卷找座位
  • Go sdk下载和配置环境变量
  • qt的项目结构
  • 【NLP】文本特征处理:n-gram特征和文本长度规范
  • ESP32人脸识别开发 ---partitions.csv配置的一些说明(五)
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
  • vue.config.js 配置 devserve 配置
  • 不入耳耳机什么牌子性价比高?五大年度必选款揭秘
  • SQL Zoo 6.The JOIN operation
  • 视频教程:Vue3移动端抽屉弹层组件实战
  • CSS 的 BFC(块级格式化上下文)
  • 【2023年】云计算金砖牛刀小试2
  • python--将mysql建表语句转换成hive建表语句
  • 异步调用实践:Async,Future, TaskExecutor、EventListener
  • Flask 异常处理
  • 【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置
  • linux crontab没有按照规则执行排查
  • Cloudflare的D1使用技巧
  • 解决端口号被占用问题
  • 如何在linux上部署zabbix监控工具
  • vulnhub系列:sp eric
  • JVM二:JVM类加载机制
  • 对于springboot无法连接redis解决方案
  • 关于android中的各种尺寸与计算
  • MySQL避免索引失效的方法详细介绍
  • 【Java】深入了解 Java 的 charAt() 方法
  • Linux 下 ETCD 安装、配置与命令使用总结
  • C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习
  • 【antd】antd3的表单校验不提示报错信息