Socket 编程极简入门

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

Socket 基础

socket是一套用于不同主机间通信的API,工作在TCP/IP协议之上,应用无处不在。比如浏览器,手机应用,用于服务器管理的SSH客户端,全都是基于 socket 实现的,要通过 socket 与不同主机之间建立通信,我们只需要指定主机的 IP 地址和一个端口号,IP 地址用于唯一标识你的网络设备,端口用于区分主机上的不同应用。

1.jpg

通过 socket 我们可以建立一条用于不同主机不同应用的之间的虚拟数据通道,并且是点对点的(应用对应用的),就像是将一条数据线连接在不同应用的插槽上。

我们经常用到的 socket 有两种类型,TCP 和 UDP。

TCP主要有两个特点:就是可靠和顺序性。首先,它的底层会自动检测并回传丢失的数据包,因此对调用者来说,发送的数据,接收方一定会接收到。其次,发送和接收的顺序是完全一致的,比如发送方发送一串字符,那么接收方会原封不动的收到同样的字符,这也是 TCP 是基于数据流的协议。

UDP 以报文为单位来收发数据,并且 UDP 不会自动回传丢失的数据包,因此不保证数据一定能被接收方接收到。因为缺少了这些检查,UDP通常具有更低的延迟并占用更少的系统资源,它更适用于像是视频通话,这种 实时性要求较高的应用。

2.jpg

python 使用 socket 实例

首先创建一个简单的服务器,这个服务器的作用就是将接收到的消息原封不动的发送出去。

server 端代码

import socket
import threading

# with 表示代码离开 with 块的时候,自动调用 s.close() 来销毁这个 socket
# AF_INET 代表使用的是 IPV4 的地址家族,SOCK_STREAM 代表使用 TCP 协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # bind 表示关联到主机的某一个网卡和端口上
    s.bind(("0.0.0.0", 1234))
    # listen 置为监听状态,等待客户端连接
    s.listen()
    c, addr = s.accept()
    with c:
        print(addr, "connected.")
        while True:
            data = c.recv(1024
            if not data:
                break
            c.sendall(data)

测试 sever 端结果

3.jpg

client 端代码

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(("127.0.0.1", 1234))
    s.sendall(b"Hello, World!")
    data = s.recv(1024)
    print("Received:", repr(data))

测试 client 端结果

4.jpg

HTTP 基本原理

5-HTTP基本原理.jpg