小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

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

数据通信与计算机网络,websocket,http,网络协议 额外说明

收录于:23天前

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 服务。浏览器通过http协议向Web服务器请求。 http在程序中有不同的实现方式。前端对象是XmlHttpRequest。在服务器端语言中,更多的是Sevlet对象和Http对象。简而言之,他们实现了一个网络服务器。

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 main

import (
	"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.data let 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。了解一下功能就可以了。

. . .

相关推荐

额外说明

JAVA中字符串常量池和缓冲池的理解和作用

字符串池与常量池是完全不同的两个东西,但是很多地方都喜欢把它们混为一谈,很容易让初学者产生误解,在这里我想好好讨论一下它们。 字符串池也可以被称为字符串常量池,我认为这个名称就是产生误解的根源,有些人说着说着就把字符串三个字省略了,只剩下了常量池...

额外说明

作为程序员,你很有必要了解一下IVX

 一、IVX是什么 iVX 是一个“零代码”的可视化编程平台,拥有方便的在线集成开发环境,不需要下载开发环境,打开浏览器即可随时随地进行项目编辑。iVX 还拥有“一站式”的云资源,通过这一套一站式服务,iVX 可以实现一站式研发、一站式部署、一站式维护。

额外说明

人工智能AI时代:全栈程序员的人生规划

标题 人工智能AI时代:全栈程序员的人生规划 1. AI时代的背景 1.1 技术的快速发展 1.2 全栈程序员面临的挑战 2. 全栈程序员的新技能要求 2.1 机器学习与深度学习基础 2.2 数据处理与分析 2.3 云计算与边缘计算 3. 人生规划的建议

额外说明

Python数据分析 — 数据分析概念、重要性、流程和常用工具

前言:Hello大家好,我是小哥谈。Python数据分析是利用Python编程语言进行数据处理、转换、清洗、可视化和建模的过程。Python在数据科学领域非常流行,有许多强大的库和工具可供使用,例如NumPy、Pandas、Matplotlib和Scik

额外说明

jfoenix 简介、中文文档、中英对照文档 下载

jfoenix 文档 下载链接(含jar包、源码、pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 jfoenix-8.0.9.jar 暂无 jfoenix-8.0.9-API文档-中英对照版.zip jfoenix 简介 JavaFX

额外说明

Java案例:Swing摇奖器

文章目录 一、运行效果 二、涉及知识点 三、实现步骤 (一)创建Java项目 (二)创建包、创建类 (三)运行程序,查看结果 一、运行效果 单击【开始】按钮,开始摇奖,单击【停止】,产生获奖数字。 二、涉及知识点 选择结构 循环结构 JFrame窗口类

额外说明

三、mycat分库分表

第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了,用户,订单交易,支付几个模块。 5.1 如何分库 一

额外说明

RAID介绍

RAID技术 RAID,全称为Redundant Arrays of Independent Drives,即磁盘冗余阵列。 这是由多块独立磁盘(多为硬盘)组合的一个超大容量磁盘组。 计算机一直是在飞速的发展,更新,整体计算机硬件也得到极大的提升,由于磁

额外说明

list.stream().forEach

People people1 = new People(1, "Ligs", true); People people2 = new People(2, "Songzx", false); People people3 =

额外说明

游戏找不到Steam.dll文件的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Steam.dll文件(挑选

ads via 小工具