网络通信tcp tcp客户端及服务器的python语法实现

tcp

传输层协议udp/tcp
udp:用户数据报协议(无链接,简单不可靠信息传送,信息可能丢失)
tcp:传输控制协议(Transmission Control Protocol)(面向链接/可靠/基于字节流)

tcp的可靠传输

应答机制
超时传输
错误校验
流量控制和阻塞管理

客户端
步骤:创建(套接字)->链接(服务器)->收发(消息)->关闭

import socket

def main():
    # 创建套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 强制允许端口复用
    tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 链接
    server_ip = input("请输入服务器ip:")
    server_port = int(input("请输入服务器port:"))
    server_addr = (server_ip,server_port)
    tcp_socket.connect(server_addr)

    # 发送信息
    send_data = input("请输入要发送的数据:")
    tcp_socket.send(send_data.encode("utf-8"))

    #关闭客户端
    tcp_socket.close()

if __name__ == '__main__':
    main()

注:
ip为str类型
port为int类型
connect链接一个元组
bind绑定一个元组

服务器
步骤:创建(套接字)->绑定(本地信息)->被动(转换)
->等待(客户链接)->接收(消息)->回送(消息)->关闭

import socket



def main():
    #  创建套接字(买手机)
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 强制允许端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 绑定本地信息(插手机卡)
    tcp_server_socket.bind(("",7890))

    # 监听状态转为被动(设置正常模式)
    tcp_server_socket.listen(128)

    while True:
        # 等待客户端链接(等电话)
        new_server_socket,client_addr = tcp_server_socket.accept()

        while True:
            # 接收客户端信息
            recv_data = new_server_socket.recv(1024)
            print("客户端传送过来的请求是:%s" % recv_data.decode("utf-8"))
            # 回送信息
            if recv_data:
                new_server_socket.send("本次服务已完成".encode("utf-8"))
            else:
                break

        # 关闭套接字
        new_server_socket.close()
        print("已经服务完毕...")

    tcp_server_socket.close()




if __name__ == '__main__':
    main()

注:
send发送数据
格式:套接字.send(内容.encode(“utf-8”))
sendto udp发送数据
格式:套接字.sendto(内容.encode(“utf-8”),(ip,port))
recv接收数据
格式:套接字.recv(1024).decode(“utf-8”)
recvfrom udp接收数据
格式:str(套接字.recvfrom(1024)[1]),套接字.recvfrom(1024)[0].decode(“utf-8”)
示例:recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode(“utf-8”)))

在这里插入图片描述
tcp_server_socket监听套接字,仅负责等待客户端链接
listen转为被动
accpt等待链接

在这里插入图片描述
accept产生的
client_socket服务客户端的新的套接字
clientAddr客户端地址及端口
运行到accept时默认阻塞,待客户端链接放行

解阻塞的两种情况:
客户端发送数据;
客户端调用close,客户端断开。

猜你喜欢

转载自blog.csdn.net/weixin_44850984/article/details/89213065