socket
介绍socket之前先看小编的这篇文章消息、段、数据包、帧、位、字符、字节和编码
在网络传输中数据都是经过多层封装的,在协议簇中最低层次为传输层才可以传输数据。再往底层就是面向计算机硬件和网络的部分了。例如常使用的ping baidu.com
就是网络层的ICMP协议用于在DNS服务器寻找目标主机。该层无法传输数据,网络层上层为传输层,在该层将传递的参数加入,并构成,由于其底层可以找到目标机器,传输层携带的数据就可以传递到目标主机。
因此能够传递数据的最底层为传输层。该层被包装成两个协议TCP
和UDP
。(移步之前的文章)
TCP 是有状态且安全的,而 UDP 是无状态且不安全的。但它们都是全双工连接,可以相互通信并传输字节。
TCP是一种协议,而不是具体的实现方式。在程序中Socket为TCP的实现方式。在socket不需要开发者定义或者遵循TCP的各种规范,scoket封装了主机之间的连接过程,如三次握手等,只需要开发者提供目标主机信息,以及要传输的数据,使用scoket暴露的API操作scoket即可。
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协议是在TCP协议上继续封装的应用层协议。 http协议在软件中应用广泛。
http 是最常见的 Web 服务。浏览器通过http协议向Web服务器请求。 http在程序中有不同的实现方式。前端对象是XmlHttpRequest。在服务器端语言中,更多的是Sevlet对象和Http对象。简而言之,他们实现了一个网络服务器。
RPC
的诞生是为了解决服务器之间的通讯,服务器一般来说可以通过TCP来通讯,也就是上一节的Socket,但是这样的通讯比较繁琐。于是就有了在服务端模拟浏览器继续使用Http协议实现服务端之间的通讯。后来有诞生了基于TCP协议的RPC通讯。(对tcp实现新的封装用来实现服务端通信)。
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中,通过数据流来实现通讯。
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。了解一下功能就可以了。