网络通信模块 Python版本

网络通信

1、基本概念介绍

1、IP地址
在网络中ip地址通常为用于标记一台电脑的地址,为网络通信服务的,后边我们会讲到tcp/ip协议;
2、端口
在了解端口的过程中,我们需要首先知道进程与线程的概念,对于进程来说可以理解为一个电脑中的程序,例如qq,微信,游戏等,对于线程就是在这个进程中所包含的几个后台应用比如多线程,多个线程同时执行,例如java中的Thread,端口就是一个进程占据一个端口,例如mysql占据3306端口;

2、socket介绍

socket就是套接字,用于进程间进行网络通信的一个形式,现在很多网络通信都是在使用这个套接字,通常我们在使用这个套接字的时候需要首先将socket创建出来例如

# AF_INET:代表了ipv4,ipv4就是四位0-255组成的这几个数,例如192.168.1.1
# SOCK_DGRAM :是使用udp协议
# SOCK_STREAM : 是使用tcp协议
udp_socket = socket(AF_INET,SOCK_DGRAM)

3、udp协议介绍

首先介绍udp协议,udp通信比较简单直接,直接可以向一个端口ip就可以发送数据,尤其适合于发送广播,以下是udp通信的具体步骤,代码使用Python代码
udp

(1)创建socket套接字
(2)准备发送的数据以及目的的ip和端口号
(3)关闭套接字

其中以下代码可以修改为while循环发送,以下只是用作示例,大家可以根据自己的需要进行修改。

from socket import *
# udp发送端,也就是客户端
def main():
    # 创建套接字
    udp_socket = socket(AF_INET,SOCK_DGRAM)

    # 发送数据,向指定的端口ip
    local_addr = ('127.0.0.1',8080)
    # 准备发送的数据
    data = input("输入发送数据")

    udp_socket.sendto(data.encode("utf-8"),local_addr)

    # 关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

但是对于udp服务器端代码是有所差别的,需要绑定指定的端口以及ip的,因为其他的客户端需要连接这个服务器的,所以以下代码为udp服务器的程序:根据自己的需要自动改为循环相关语句即可
对于接受端步骤:
(1)创建套接字
(2)socket绑定ip以及端口号
(3)接受数据
(4)关闭套接字

from socket import *

def main():
    # 创建套接字
    udp_socket = socket(AF_INET,SOCK_DGRAM)

    # 绑定ip以及端口号
    udp_socket.bind(('127.0.0.1',8082))

    # 接收数据
    recv_data = udp_socket.recvfrom(1024)

    print(recv_data[0].decode("gbk"))
    print(recv_data[1])

    # 关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

4、 网络中的编码转换为题

对于str转换为byte类型,因为网络通信都是以字节的方式传输的,所以对于
encoding是str->byte
decoding是byte->str

以上udp协议的问题说明:

  为什么服务器中需要绑定端口ip呢?而客户端则不需要,因为现在客户端有很多在访问服务器,客户端可以来自不同的用户,自然也就端口以及ip不需要绑定,但是服务器绑定是为了能够方便其他客户端能够精确的找到,然后完成通信。
  一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化
   一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的
  

5、tcp协议介绍

1、tcp通信的特点
(1)面向连接:这点就是说,在进行网络通信的时候需要先完成客户端与服务器的连接,这样建立连接之后才能进行相互通信,这个可以结合着代码进行理解
(2)可靠传输
tcp传输采用应答机制(三次握手、四次挥手)
tcp采用校验位的形式
超时重传
流量控制和阻塞管理,避免传输太快,接收不完全

6、udp跟tcp通信的特点比较

首先udp通信速度快,不需要tcp那些复杂的步骤
另外tcp:
(1)面向连接(确定三次握手之后才能连接之后才进行网络通信)
(2)tcp的可靠机制,有应答机制
(3)有校验位,可以无差错传输
(4)阻塞、流量控制
(5)重复丢失的数据包

tcp客户端的实现

(1)创建socket
(2)建立连接connect
(3)准备发送数据
(4)关闭socket

from socket import *

def main():
    # 创建套接字
    tcp_socket = socket(AF_INET,SOCK_STREAM)

    # 建立连接
    addr = ('127.0.0.1',8088)
    tcp_socket.connect(addr)

    # 发送数据
    tcp_socket.send("dada".encode("utf-8"))

    # 关闭套接字
    tcp_socket.close()

if __name__ == "__main__":
    main()

tcp服务器的实现

from socket import *

def main():
    # 创建套接字
    tcp_socket = socket(AF_INET,SOCK_STREAM)

    # 绑定端口
    tcp_socket.bind(('127.0.0.1',8087))

    # 开启监听
    tcp_socket.listen(128)  # 这个主要是为了可以多个客户端能连接该服务器

    # 开始接收,这里accept接收到数据之后解阻塞,创建一个新的套接字用于完成与这个客户端之间的通信
    # 可以想象成电话机,拨打10086之后,总台将分配一个客服来为这个客户服务
    new_client_socket,addr = tcp_socket.accept()
    recv_data = new_client_socket.recv(1024)

    new_client_socket.send("OKKK".encode("utf-8"))

    new_client_socket.close()
    # 关闭套接字
    tcp_socket.close()

if __name__ == "__main__":
    main()

上述程序主要难理解的在于accept()返回一个新的套接字,这里将会阻塞,等待连接之后,然后开始接下来的操作

tcp需要注意的点:


    tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
    tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
    tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
    当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
    当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
    listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
    关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
    关闭accept返回的套接字意味着这个客户端已经服务完毕
    当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

7、tcp三次握手、四次挥手

在这里插入图片描述
上述三次握手的描述:
①在进行tcp通信的时候,客户端将发生一个请求包,SYN 数据为J,此时客户端处于connect阻塞状态
②服务器收到SYN J时候,发送一个J+1代表服务器应答,知道了,将ACK J+1 服务器处于accept状态阻塞
③服务器再次发送SYN K状态
④客户端应答K+1两者将解阻塞
其中2、3步骤为了效率可以合并

tcp四次挥手

在这里插入图片描述
我们知道tcp是全双工通信的
①客户端使用close()命令,发给服务器,此时客户端为停止发送状态
②服务器应答收到,此时服务器处于停止接收状态
③服务器说我也关闭了啊
④客户端应答
为什么2、3步骤不能合并?
因为在服务器应答之后停止接收,他不一定立即关闭close套接字,有可能在这个过程中进行某些其他的操作,比如执行一条语句,所以无法合并!

最后,总结

总结

1、介绍基本概念
2、介绍udp协议
3、介绍tcp协议
4、两者的比较
5、tcp三次握手、四次挥手

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值