一篇搞懂socket、websocket、http协议及其使用

socket

介绍socket之前先看小编的这篇文章报文、报文段、数据包、帧、比特、字符、字节,与编码

ALT

在网络传输中数据都是经过多层封装的,在协议簇中最低层次为传输层才可以传输数据。再往底层就是面向计算机硬件和网络的部分了。例如常使用的ping baidu.com就是网络层的ICMP协议用于在DNS服务器寻找目标主机。该层无法传输数据,网络层上层为传输层,在该层将传递的参数加入,并构成,由于其底层可以找到目标机器,传输层携带的数据就可以传递到目标主机。

因此能够传递数据的最底层为传输层。该层被包装成两个协议TCPUDP。(移步之前的文章)

TCP是有状态安全的,UDP是无状态不安全的。但是它们都是全双工连接,可以互相通讯,以字节传输。

在这里插入图片描述
TCP是一种协议,而不是具体的实现方式。在程序中Socket为TCP的实现方式。在socket不需要开发者定义或者遵循TCP的各种规范,scoket封装了主机之间的连接过程,如三次握手等,只需要开发者提供目标主机信息,以及要传输的数据,使用scoket暴露的API操作scoket即可。

【了解Java网络编程】实现TCP网络通信

Java网络编程

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建Socket服务器ServerSocket server = new ServerSocket(9000);//等待服务器连接//获取客户端的流对象用于传输数据Socket socket = server.accept();//获取客户端数据流(输入流)InputStream inputStream = socket.getInputStream();//数据输入到输入流byte by[] = new byte[20];inputStream.read(by);String str = new String(by);System.out.println(str);}
}
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//创建socket对象//提供目标ip和端口Socket socket = new Socket("127.0.0.1",9000);//socket流传数据OutputStream outputStream = socket.getOutputStream();//写入数据(向传输层的报文写入数据)//数据必须以字节流传输outputStream.write("hello".getBytes());//关闭连接socket.close();}
}

socket是基于TCP和UDP的实现方式,使用字节传输数据。

http

http协议

http协议是应用层协议,在TCP协议上继续封装,http协议广泛应用于软件中。

更多移步

http最常见的是web服务,浏览器请求web服务器通过http协议。http在程序中有不同的实现方式,前端对象是XmlHttpRequest。在服务器端语言中就更多了Sevlet对象,Http对象,总之是实现一个web服务器。

RPC的诞生是为了解决服务器之间的通讯,服务器一般来说可以通过TCP来通讯,也就是上一节的Socket,但是这样的通讯比较繁琐。于是就有了在服务端模拟浏览器继续使用Http协议实现服务端之间的通讯。后来有诞生了基于TCP协议的RPC通讯。(对tcp实现新的封装用来实现服务端通信)。

RPC远程调用

websocket

http协议在基于B/S和C/S的通信中已逐渐不满足需要,有时候需要客户端和服务端互相通讯。服务端和客户端可以互相发送消息,这时WebSocket又诞生了。

websocket基于http1.1协议重新封装,实现了B/S和C/S的双向通讯。websocket中服务器可以向客户端发送消息反之亦可。

由于websocket本身也是基于http1.1构建的,因此websocket本质上还是B/S或C/S架构,同时也是基于服务器运行。

socket和websocket很容器混淆,甚至认为websocket额服务端即使socket实现的。其实socket和websocket几乎没有任何关系,就像java和javascript一样。

http协议中,通过Request和Response实现通讯。
websocket中,通过数据流来实现通讯。

WebSocket新一代推送技术及Java Web实现

package mainimport ("github.com/gorilla/websocket""log""net/http"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {return true},
}func main() {// 创建HTTP服务器http.HandleFunc("/ws", handleWebSocket)log.Println("Server started on :8080")log.Fatal(http.ListenAndServe(":8080", nil))
}func handleWebSocket(w http.ResponseWriter, r *http.Request) {// 升级HTTP连接为WebSocket连接conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}defer conn.Close()// 处理WebSocket连接for {// 读取消息messageType, p, err := conn.ReadMessage()if err != nil {log.Println(err)return}log.Println("Received message:", string(p))// 发送消息err = conn.WriteMessage(messageType, []byte("Hello, world!"))if err != nil {log.Println(err)return}}
}
<!DOCTYPE html>
<html>
<head><title>WebSocket Test</title><input  id="input"/><button onclick="getInput()">send</button><button onclick="closeSocket()">close</button><div style="border: aqua; width: 300px; height: 200px; background-color: aliceblue;"  id="chatbox"></div>
</head>
<body><script>var ws = new WebSocket("ws://localhost:8080/ws");ws.onopen = function() {console.log("WebSocket connection opened.");};ws.onmessage = function(event) {//console.log("Received message: " + event.data);var str = event.datalet msg = '<span style="width: 50px; height: 20px; background-color: aqua; float: left;">'+str+'</span><br>'document.getElementById("chatbox").innerHTML += msg};// ws.onclose = function() {//     console.log("WebSocket connection closed.");// };// ws.onerror = function(event) {//     console.log("WebSocket error: " + event.data);// };function getInput(){var str = document.getElementById('input').value//console.log(str);let msg = '<span style="width: 50px; height: 20px; background-color: aqua;  float: right;">'+str+'</span><br>'ws.send(str);document.getElementById("chatbox").innerHTML += msg}function closeSocket(){ws.onclose = function() {console.log("WebSocket connection closed.");};}</script>
</body>
</html>

请添加图片描述

代码实现了websocket通信,后端返回随机数模拟对话。注意合理使用WebSocket的方法即可,前端的方法都是一样的,后端服务器语言不同语言封装的不一样的提供的API不一样,了解功能即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看windows上的dll内容

1、安装Visual Studio时选择c桌面开发和通用Windows平台开发 2、cmd运行在Visual Studio安装路径下的VC\Auxiliary\Build\vcvars64.bat 3、在这个窗口中运行dumpbin

【JVM内存模型】—— 每天一点小知识

&#x1f4a7; J V M 内存模型 \color{#FF1493}{JVM内存模型} JVM内存模型&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x…

如何修改Jupyter Notebook的默认目录和默认浏览器

一、修改默认目录 Jupyter Notebook的文件默认保存目录是C:\Users\Administrator&#xff0c;默认目录可在黑窗口中查看&#xff0c;如下图所示&#xff1a; 为了方便文档的管理&#xff0c;可将默认目录修改成自己想保存的地方。修改方法如下&#xff1a; 1、找到config文件 …

迅为RK3568开发板Buildroot 系统自启动 QT 程序

本小节将讲解如何开机自启动 QT 程序。 在设置自启动 QT 程序之前&#xff0c;首先要编译好 QT 可执行程序&#xff0c;完成以下两步。 1、 已经根据 03_【北京迅为】itop-3568 开发板快速使用编译环境 ubuntu18.04 v1.0.doc 第 10 章节进行了 QT 程序的交叉编译 2、 将交叉…

SpringCloud(2) 注册中心Eureka、Nacos

目录 1.背景2.Eureka 注册中心3.Nacos 注册中心4.常见面试题1&#xff09;服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册发现&#xff1f;2&#xff09;Nacos 和 Eureka 有什么区别&#xff1f; 1.背景 注册中心是微服务中必须要使用的组件&#xff0c;…

PCL点云处理之细小空洞填补 (一百九十八)

PCL点云处理之细小空洞填补 (一百九十八) 一、算法介绍二、具体实现1.代码2.结果一、算法介绍 点云扫描过程中,由于遮挡或其他原因,可能存在一些细小空洞,有可能造成数据处理上一些问题,这里介绍一种填补细小空洞的方法。具体方法和效果如下所示 二、具体实现 1.代码…

Springboot整合Activiti详解

文章目录 版本依赖配置文件需要注意的问题画流程图activiti服务类进行编写流程部署流程定义启动流程流程实例 测试流程启动流程完成任务受理任务 版本依赖 开发工具 IDEASpringBoot 2.4.5&#xff08;这里我试过SpringBoot 3.1.1版本&#xff0c;Activiti没有启动&#xff0c;…

Spring中@NotEmpty、@NotBlank、@NotNull 的区别和使用

1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.5.RELEASE</version> </dependency>NotEmpty、NotBlank、NotNull 包的位置&#xff1…

《Redis 核心技术与实战》课程学习笔记(二)

数据结构&#xff1a;快速的 Redis 有哪些慢操作 数据库这么多&#xff0c;为啥 Redis 能有这么突出的表现呢&#xff1f; 一方面&#xff0c;因为它是内存数据库&#xff0c;所有操作都在内存上完成&#xff0c;内存的访问速度本身就很快。另一方面&#xff0c;因为&#xff…

spfa求负环

1.虫洞 Wormholes&#xff08;裸spfa判断负环问题&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1507 #include<bits/stdc.h> using namespace std; const int N510,M5210; int d…

【Rust】安装

文章目录 1.官网下载2.安装3.安装验证4.打开本地文档5.安装插件6.HelloWorld①新建项目目录使用VSCode打开②新建rs文件③编译④运行 7.HelloCargo①新建项目目录使用VSCode打开②cargo build③cargo run④cargo check⑤为发布构建 8.更新与卸载 1.官网下载 官网地址&#xff…

基于单片机智能手环心率老人防跌倒心率体温 步数里程

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶显示心率体温步数等信息&#xff1b;通过按键设置心率、体温上限设置&#xff1b;当心率或者体温超过按键设置上限蜂鸣器进行声光报警提醒&#xff1b;通过wifi模块esp8266把数据发送到手机端进行显整个电路以5v供电&a…