socket编程

Posted zh-xiaoyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket编程相关的知识,希望对你有一定的参考价值。

技术图片
1、C/S B/S架构(*****)
    c:client
    s:server
    b:browser
    学习目标:开放一个客户端软件和服务端软件,两者基于网络通信


2、什么是网络?(*****1、物理连接介质
    2、互联网协议(计算机界的英语)


3、OSI七层协议(**)
C/S
B/S
应(应、表、会):应用软件自定义协议,HTTP,FTP,HTTP+SSL
传输层:TCP、UDP,基于端口工作。机器上每起一个套接字程序都会对应一个唯一的端口号,有了端口就能找到这台机器之上唯一的一个套接字程序。

网络层:IP,基于IP地址。IP地址标识局域网地址在哪,所以有了IP和mac地址就标识了互联网中独一无二的一个计算机

数据链路层:Ethernet基于mac地址。Ethernet协议规定但凡接入互联网的机器都必须有一块网卡,每块网卡上必须有一个地址,这个地址
           就是机器的mac地址,mac地址是全世界上独一无二的地址,所以有了mac地址就能标识一个局域网中特定的一台计算机。
           Ethernet协议采用最高老的工作方式---广播:通讯靠吼,在一个局域网内有效,跨局域网时mac地址出不去。

物理层:建立物理连接,传播电信号


4、如何标识全世界范围内独一无二的一个socket程序(*****)
    ip+port


5、什么是socket(*****)
    socket是位于应用层与传输层之间的一层抽象接口层
    socket封装了tcp以下的协议,我们在编写网络通信的程序时只需要遵循socket的规范
    写出的程序自然遵循tcp或udp协议


6、TCP与UDP协议(*****)
    三次握手建连接:

    客户端给服务端发请求(syn=1,seq=x)建连接-->

                                     <--服务端同意(ack=1+x),并且向客户端发请求(syn=1,sqe=y)建连接
                                        (此时c--->s建连接成功)

    客户端回应服务端(ack=1+y)-->
       (此时s--->c建连接成功)

    注:客户端有SYN_SENT和ESTABLISHED两种状态,服务端有LISTEN、SYN_RECV和ESTABLISHED三种状态
    四次挥手断连接:

    当c-->s提交完数据时,客户端向服务端发请求(FIN=1)断连接--->
                                                            <---服务端发确认信息(ack=1),
                                                                (此时c-->s连接断开)

                                                     <---当服务端传输完数据,向服务端发请求(FIN=1)断连接
    客户端回确认信息(ack=1)--->
    (此时s---c连接断开)

    注:通常发断连接请求的是服务端,因为服务端同时会服务多个客户端,它的资源要尽可能多的腾出来给后来的客户端去用。
        状态有:FIN_WAIT_1(主动断开连接,谁先发起谁先进去这种状态,通常服务端先进入这种状态)、CLOSE_WAIT、
        FIN_WAIT_2(被动断开连接)、LAST_ACK与TIME_WAIT

    tcp:
        优点:
            发一条数据必须收对方的确认后才会从自己的操作系统缓存清楚该条消息,否则重发
            可靠协议
        缺点:
            发送数据效率必须udp低
    udp:
        优点:
            发送数据效率高
        缺点:
            发一条数据无需收到对方的确认消息,会立刻从自己的操作系统缓存清楚该条消息
            不可靠
知识点

 网络通信原理:https://www.cnblogs.com/linhaifeng/articles/5937962.html

 服务端:

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建服务器套接字对象
# print(server)  #<socket.socket fd=76, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>

#服务端和客户端都需要有ip和port,但只有服务端才绑定ip和port
server.bind((127.0.0.1,8080))
server.listen(5)  # 半连接池:限制的是请求数,而不是连接数

while True:
    conn,client_addr=server.accept() # 等待客户端发来连接请求,conn指的是双向连接(accept对应客户端的connect操作)
    print(conn)
    while True:
        try:
            data=conn.recv(1024)  #1024 接收数据的最大限制
            if not data:break  #针对linux系统
            conn.send(data.upper())  # 注意:收发都是以bytes为单位
        except ConnectionResetError:
            break
    conn.close()  #关闭客户端套接字
server.close()    #关闭服务器套接字

客户端:

import socket

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #创建客户端套接字对象

client.connect((127.0.0.1,8080))  #发起连接

while True:
    msg=input(>>: ).strip()
    client.send(msg.encode(utf-8))
    data=client.recv(1024)
    print(data.decode(utf-8))

client.close()  #关闭客户端套接字

 注:

技术图片

以上是关于socket编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?

以编程方式将按钮添加到片段