golang实现简单tcp的server端和client端

服务端server.go

package main

import (
	"fmt"
	"net"
)

/*
服务端处理流程
a.监听端口
b.接收客户端链接
c.创建goroutine,处理该链接
*/

func main() {
	listen, err := net.Listen("tcp", "0.0.0.0:20000")
	if err != nil {
		fmt.Println("listen failed,err:", err)
		return
	}
	for {
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("accept failed,err:%v\n", err)
			continue
		}
		go process(conn)
	}

}

func process(conn net.Conn) {
	defer conn.Close()
	for {
		var buf [128]byte
		n, err := conn.Read(buf[:])
		if err != nil {
			panic(err)
		}

		str := string(buf[:n])
		fmt.Printf("recv from client, data: %v\n", str)
	}

}

客户端client.go

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

/*
客户端编程模式
a.建立与服务端的链接
b.进行数据收发
c.关闭链接
*/

func main() {
	conn,err := net.Dial("tcp","0.0.0.0:20000")
	if err != nil {
		fmt.Println("dail failed, err :",err)
		return
	}
	reader := bufio.NewReader(os.Stdin)
	for {
		data, err := reader.ReadString('\n')
		if err != nil {
			fmt.Printf("read from console,err: %v\n",err)
			break
		}
		data = strings.TrimSpace(data)
		_ ,err = conn.Write([]byte(data))
		if err != nil {
			fmt.Printf("write failed ,err:%v\n",err)
			break
		}
	}
}



============================================================================

http服务器

package main

import "net/http"

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("hello world!"))
	})
	http.ListenAndServe(":9090",nil)
}

================================================================================================
package main

import (
	"fmt"
	"net/http"
)
func sayhello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world!"))
	fmt.Fprintf(w,"%v\n",r.Form)
	fmt.Fprintf(w,"path:%s\n",r.URL.Path)
	fmt.Fprintf(w,"schema\n",r.URL.Scheme)
	fmt.Fprintf(w,"hello world!\n")
}
func main() {
	http.HandleFunc("/", sayhello)
	http.ListenAndServe(":9090",nil)
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是如何使用golang语言和grpc框架实现设备连接功能,并保持双向流连接状态,期间可以实现主动发送指令和回报数据。 首先,我们需要定义一个gRPC服务,用于设备连接和数据通信,具体定义如下: ```protobuf syntax = "proto3"; package device; service DeviceService { rpc Connect(stream DeviceRequest) returns (stream DeviceResponse) {} } message DeviceRequest { string device_id = 1; bytes data = 2; } message DeviceResponse { bytes data = 1; } ``` 接着,我们可以使用gRPC框架生成golang代码,具体命令如下: ``` protoc -I=. device.proto --go_out=plugins=grpc:. ``` 生成的代码中包含了服务和客户的代码,我们可以针对这些代码进行开发。 服务代码实现如下: ```go package main import ( "context" "io" "log" "net" pb "device" "google.golang.org/grpc" ) type deviceServer struct{} func (s *deviceServer) Connect(stream pb.DeviceService_ConnectServer) error { deviceID := "" for { req, err := stream.Recv() if err == io.EOF { log.Printf("Device %s disconnected", deviceID) return nil } if err != nil { log.Printf("Error receiving from device %s: %v", deviceID, err) return err } if deviceID == "" { deviceID = req.DeviceId log.Printf("Device %s connected", deviceID) } log.Printf("Received data from device %s: %v", deviceID, req.Data) // Send response back to device if err := stream.Send(&pb.DeviceResponse{ Data: []byte("Response from server"), }); err != nil { log.Printf("Error sending response to device %s: %v", deviceID, err) return err } } } func main() { lis, err := net.Listen("tcp", ":8888") if err != nil { log.Fatalf("Failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterDeviceServiceServer(s, &deviceServer{}) log.Printf("Server started, listening on %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("Failed to serve: %v", err) } } ``` 客户代码实现如下: ```go package main import ( "context" "io" "log" "time" pb "device" "google.golang.org/grpc" ) func main() { conn, err := grpc.Dial("localhost:8888", grpc.WithInsecure()) if err != nil { log.Fatalf("Failed to connect: %v", err) } defer conn.Close() client := pb.NewDeviceServiceClient(conn) stream, err := client.Connect(context.Background()) if err != nil { log.Fatalf("Failed to connect: %v", err) } defer stream.CloseSend() go func() { for { // Send data to server if err := stream.Send(&pb.DeviceRequest{ DeviceId: "device1", Data: []byte("Data from device1"), }); err != nil { log.Printf("Error sending data to server: %v", err) } time.Sleep(time.Second) } }() for { // Receive response from server res, err := stream.Recv() if err == io.EOF { log.Println("Server closed the stream") return } if err != nil { log.Printf("Error receiving response from server: %v", err) return } log.Printf("Received response from server: %v", res.Data) } } ``` 客户代码中使用了一个goroutine来不断向服务发送数据,服务在接收到数据后,会向客户回复一条固定的消息。客户在接收到服务的回复后,会将回复内容输出到日志中。 以上就是使用golang语言和grpc框架实现设备连接功能的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值