python之网络编程(TCP编程)

TCP:Transmission Control Protocal 传输控制协议

是一种面向连接的,可靠的、基于字节流的传输层通信协议
数据传输的可靠性的处理方式,经典的 TCP 模型中通过如下两种方式完成连接的可靠性

  • 三次握手建立连接
    两个序号和三个标志位:

    (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
    (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
    (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
    (A)URG:紧急指针(urgent pointer)有效。
    (B)ACK:确认序号有效。
    (C)PSH:接收方应该尽快将这个报文交给应用层。
    (D)RST:重置连接。
    (E)SYN:发起一个新连接。
    (F)FIN:释放一个连接。

  • 四次挥手断开连接
    这里写图片描述

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

服务端开发

'''
TCP服务端模块
'''
import socket

#定义链接信息
HOST = ''
RORT = 8080
ADDRESS = (HOST,RORT)

#定义一个读写数据的缓冲字节大小
BUFFER = 1024

#创建一个TCP服务端套接字对象
#tcp_server = socket.socket()什么都不传默认tcp服务
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                        #指定的因特网寻址      面向链接的套接字
#绑定主机端口号
tcp_server.bind(ADDRESS)

#监听端口号:参数~排队的客户端
tcp_server.listen(5)

while True:

    #等待客户端的链接,建立链接
    print("waiting for connect...")
    server_socket,addr = tcp_server.accept()
    print("client already connect!welcome to server:",addr)

    while True:
        #发送一个消息给客户端
        server_info = input("<服务端>请输入您要发送信息:")
        server_socket.send(server_info.encode("utf-8"))

        #接受客户端发送的消息
        msg = server_socket.recv(BUFFER)
        print("client:",msg.decode("utf-8"))
        if msg == b'BYE':
            #关闭套接字,释放资源
            server_socket.close()
            break

#程序结束时,关闭服务端
tcp_server.close()

客户端开发

'''
TCP客户端
'''
#引入需要的模块
import socket

#定义链接信息
TARGET_HOST = '192.168.13.28'
TARGET_PORT = 8080
TARGET_ADDRESS = (TARGET_HOST,TARGET_PORT)

#缓冲的字节大小
BUFFER = 1024

#创建一个TCP套接字对象
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#链接指定的主机
tcp_client.connect(TARGET_ADDRESS)

#收发消息
while True:
    #接受服务器消息
    msg = tcp_client.recv(BUFFER)
    print("server:",msg.decode("utf-8"))

    #向服务器发送消息
    info = input("请输入您要发送的消息:")
    tcp_client.send(info.encode("utf-8"))

    if info == "BYE":
        #关闭套接字
        tcp_client.close()
        break

print("客户端退出!")

猜你喜欢

转载自blog.csdn.net/qq_41963640/article/details/81673806