您现在的位置是:首页 > 正文

远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据

2024-01-30 22:21:55阅读 0
1. 什么是socket?

在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

2. 什么是websocket?

WebSocket是一种网络通信协议,是HTML5新增的特性,实现了基于浏览器的远程socket,使浏览器和服务器可以进行全双工通信。

3. 要实现什么样的效果?
  • socket服务端和web服务端实现数据双向通信。socket服务端可以是任何语言实现(c++、java、php、go等),任何部署方式(本机、远程)

  • web服务端(go 实现)和前端通过websocket实现数据双向通信.

  • socket服务、web服务、前端实现数据双向通信。

    前端通过websocket发送数据给web服务 -》 web服务 -》 web服务将数据通过socket推送给远程服务端

    远程服务通过socket将数据推送给web服务 -》 web服务 -》 web服务将数据通过websocket推送给前端

    远程服务和前端即使数据发送者也是接收者。

    web服务是数据中转战。(也可以处理业务需求)

4. 如何实现?

在实现三方通信数据双向通信之前,先实现

  1. 远程服务与web服务之间通过socket进行全双工通信
  2. web服务通过websocket将数据主动推送给前端并接收前端发来的数据
1. 远程服务与web服务之间通过socket进行全双工通信

socket服务可用其他任何语言实现(c++、java、php等)。这里采用go

server: 远程服务

  1. 监听
listener, err := net.Listen("tcp", "127.0.0.1:5412")
  1. 建立连接
conn, err := listener.Accept()
  1. 读 (注意: 如果数据太长,需要分片处理)
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入服务端发送的数据:")
sendinfo, err := reader.ReadString('\n')
if err != nil {
    fmt.Println("读取服务端要发送的数据出错!")
    continue
}
  1. 写入
sendinfo = strings.TrimSpace(sendinfo)
if sendinfo == "exit" {
    fmt.Println("退出服务端")
    return
}
conn.Write([]byte(sendinfo))

client: web服务

  1. 连接
conn, err := net.Dial("tcp", "127.0.0.1:5412")
for {
    n, err := conn.Read(buffer[:])
    if err != nil {
        fmt.Println("客户端读取socket服务端数据出错")
        break
    }
    fmt.Println("客户端读取socket数据是:", string(buffer[:n]))
}
  1. 写入
fmt.Print("请输入要发送给socket服务端的数据: ")
msg, err := reader.ReadString('\n')
if err != nil {
    fmt.Println("读取客户端要发送的数据出错!")
    return
}
msg = strings.TrimSpace(msg)
if msg == "exit" {
    fmt.Println("退出socket客户端")
    return
}
conn.Write([]byte(msg))
2. web服务基于websocket和前端通信

web服务

  1. 升级HTTP
ar upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

ws, err = upgrader.Upgrade(w, r, nil)
func read() {
	for {
		_, p, err := ws.ReadMessage()
		if err != nil {
			log.Println(err)
			return
		}
		log.Println("Received message:", string(p))
	}
}
func write() {
	reader := bufio.NewReader(os.Stdin)

	for {
		fmt.Println("请输入要发送给socket服务端的数据: ")
		msg, err := reader.ReadString('\n')

		err = ws.WriteMessage(websocket.TextMessage, []byte(msg))
		if err != nil {
			log.Println(err)
			return
		}
	}
}

前端

var input = document.getElementById("input");
var output = document.getElementById("output");
var socket = new WebSocket("ws://localhost:1234");

socket.onopen = function () {
    output.innerHTML += "Status: Connected\n";
};

socket.onmessage = function (e) {
    output.innerHTML += "Server: " + e.data + "\n";
};

function send() {
    socket.send(input.value);
    input.value = "";
}
3. 三方双向通信

实现了第一步和第二步就可以实现第三步,将第一步和第二步的代码进行合并即可。

唯一不同这里定义里两个无缓冲的通道.

  • 前端将数据发送给web服务,web服务拿到数据写入chanMess中。在web服务和远程服务通信期间,就可以读chanMess中的数据,然后将数据推送给远程服务

  • 远程服务将数据推送给web服务,web服务拿到数据写入socketMess中。在web服务和前端通信期间,就可以读socketMess中的数据,然后将数据推送给前端

var chanMess    = make(chan []byte) // 存储 websocket数据
var socketMess  = make(chan []byte) // 存储 socket数据
4. 完整代码可以私聊获取

网站文章

  • RIPng配置(GNS3)

    RIPng配置(GNS3)

    1、拓扑图2、配置路由器(R3为例)给每个路由器配置RIP 1在每个路由器中对相应的接口配置相应的ipv6地址并将每个接口配置RIP 1 enable给R3的f0/0接口配置宣告默认路由给ISP配置静态路由3、测试网络连通性PC-1 ping PC-2 PC-4和外网PC-2 ping PC-1 P...

    2024-01-30 22:21:47
  • 多功能呀哩盒子iApp源码

    多功能呀哩盒子iApp源码

    多功能Iapp源码 – 上百种功能集成,简洁实用,适合游戏、动漫、漫画、小说等应用这款Iapp源码拥有上百种功能,包含游戏、动漫、漫画、小说等多种应用。其简洁实用的设计,使得它能够轻松地整合不同的功能...

    2024-01-30 22:21:39
  • 安卓基础:内容提供者ContentProvider

    一、基本概念 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据 的安全性。 二、自定义内容提供者实现增删改查 1、创建一PersonProvider继承ContentProvider,实现六个方法,增删改查以及onCreate和getType。(因篇幅限制,

    2024-01-30 22:21:09
  • 漫谈程序员系列:快来约这些女生,保你脱单

    漫谈程序员系列:快来约这些女生,保你脱单

    快来勾搭这几类女生,保你脱单……

    2024-01-30 22:21:03
  • Arduino 控制9g舵机

    Arduino 控制9g舵机

    9g舵机即下图所示种类舵机:1、这种舵机由于有限位器,因此只能在-90°和+90°的范围内旋转。2、同时使用普通数字引脚即可控制。3、棕色–地,红色–5V,橙色–信号。其控制信号为多个20ms周期经调...

    2024-01-30 22:20:44
  • 计算机专业论文选题网站方面,5大网站汇总,搞定新颖的计算机专业毕业设计网站汇总...

    计算机专业论文选题网站方面,5大网站汇总,搞定新颖的计算机专业毕业设计网站汇总...

    原标题:5大网站汇总,搞定新颖的计算机专业毕业设计网站汇总2021年了,很多计算机专业的同学都会问,我不想再做XX管理系统、XX选课系统了,哪里有一些新颖的毕业设计题目可以参考?或者做新颖的毕业设计应...

    2024-01-30 22:20:17
  • python入门基础知识!新手入门Python必备

    python入门基础知识!新手入门Python必备

    python入门基础知识!新手入门Python必备

    2024-01-30 22:19:50
  • SpringMvc源码全解

    SpringMvc源码全解

    文章目录一、SpringMVC请求处理流程2、 一、SpringMVC请求处理流程 SpringMVC的核心组件和请求处理流程如下: 1、 DispatcherServlet是SpringMVC中的前...

    2024-01-30 22:19:43
  • 八、什么是静态方法和静态变量?有什么特点?

    八、什么是静态方法和静态变量?有什么特点?

    在Java中,static表示“静态的”,它也是一种修饰符,可以修饰属性、常量、方法、代码块和内部类。

    2024-01-30 22:19:35
  • Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeExceptio——Git更新项目失败

    Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeExceptio——Git更新项目失败

    Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeException: Invocation failed Server returned invalid Response的解决

    2024-01-30 22:19:01