• TCP/UDP/socket


    TCP/UDP协议:

    TCP(Transmission Control Protocol)一种面向连接的、可靠的、传输层通信协议(比如:打电话)

    优点 : 可靠,稳定,传输完整稳定,不限制数据大小
    缺点 : 慢,效率低,占用系统资源高,一发一收都需要对方确认
    应用 :Web浏览器,电子邮件,文件传输,大量数据传输的场景
    UDP(User Datagram Protocol)一种无连接的,不可靠的传输层通信协议(比如:发短信)

    优点 : 速度快,可以多人同时聊天,耗费资源少,不需要建立连接
    缺点 : 不稳定,不能保证每次数据都能接收
    应用 :IP电话,实时视频会议,聊天软件,少量数据传输的场景
    客户端和服务端在建立连接时 : 三次握手
    客户端和服务端在断开连接时 : 四次挥手

    SYN 创建连接
    ACK 确认响应
    FIN 断开连接

    三次握手:

    四次挥手:

    MSL为最大报文段生存时间
    默认规定MSL为2分钟,但实际应用中常用的是30秒,1分钟和2分钟等。

    整体缩略图

    在这里插入图片描述

    socket模块

    socket的意义 : 通络通信过程中,信息拼接的工具(中文:套接字)

    在这里插入图片描述

    TCP协议

    基本语法

    • server服务端
    # ### socket 服务器
    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定ip和端口(注册网络,让别人找到你)
    # "127.0.0.1" 默认本机的ip
    sk.bind(  ("127.0.0.1",9000)  )
    # 开启监听 (等待别人连接服务器)
    sk.listen()
    
    '''
    # 建立三次握手,建立连接 , 程序加了阻塞 ,
    建立三次握手如果失败,程序不往下执行
    '''
    conn,addr = sk.accept()
    print(conn,addr)
    # 最大一次性接受1024个字节.程序再次加了阻塞,没有接收到数据,不会向下执行代码
    msg = conn.recv(1024)
    # 把字节流恢复成正常的字符串(解析字节流变成字符串)
    print(msg.decode("utf-8"))
    
    # 发送给客户端数据
    conn.send(" 我真的好哟".encode("utf-8"))
    
    
    # 执行四次挥手,断开连接
    conn.close()
    # 关闭socket对象,退还占用的端口号
    sk.close()
    • client客户端
    import socket
    
    # 产生一个socket对象
    sk = socket.socket()
    sk.connect( ("127.0.0.1",9000) )
    
    # 发送消息 (发送的是二进制字节流)
    sk.send("你好么,我好哟".encode("utf-8"))
    
    # 接受消息 (发送完之后,程序加阻塞,等待服务器回应的数据,最大接受1024个字节)
    res = sk.recv(1024)
    strvar = res.decode("utf-8")
    print(strvar)
    
    # 关闭连接
    sk.close()
    

      

    可循环发送消息可退出

    • server服务端
    # ### 循环发消息
    import socket
    sk = socket.socket()
    # 在网络中注册该主机
    sk.bind( ("127.0.0.1",9001) )
    # 监听端口
    sk.listen()
    
    
    
    while True:
    	# 建立三次握手
    	conn,addr = sk.accept()
    	while True:
    		res = conn.recv(1024)
    		# 把字节流变成原本字符串
    		res2 = res.decode("utf-8") 
    		print(res2)
    		strvar = input("你要发送给客户端什么消息呢?:")
    		conn.send(strvar.encode("utf-8"))
    		if strvar == "q":
    			break
    
    	# 执行四次挥手
    	conn.close()
    
    # 退还系统的9000端口
    sk.close()
    

      

    • client客户端
    import socket
    sk = socket.socket()
    sk.connect( ("127.0.0.1",9001) )
    
    
    
    while True:
    	strvar = input("请输入您要发送的消息").strip()
    	# 发送的数据需要二进制字节流
    	sk.send(strvar.encode("utf-8"))
    	res = sk.recv(1024)	
    	if res == b"q":
    		break
    	print(res.decode("utf-8"))
    	
    # 关闭连接
    sk.close()
    

      

  • 相关阅读:
    今天学会了如何察看SSDT里面的东西、修改里面的地址
    今天。。。。忙了一天
    我承认,我怕,我很怕
    WinCE下的第二个窗口程序
    终于搭好了WinCE上MFC的SDK环境
    原来腾迅的QQ号竟然是个int变量
    操了,编译器,你就不能少给我下几个断么
    谁能教我网络编程阿
    反汇编。。。本来以为很难,原来却这么容易
    PE头里的东西更多。。。越看越恶心了,我都不想看了
  • 原文地址:https://www.cnblogs.com/liya1014/p/14754771.html
Copyright © 2020-2023  润新知