python TCP和UDP编程

  • 一、UDP编程
    • 1.特点
      • 1、UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
      • 2、UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。
      • 3、UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
    • 2.应用场景:
      • UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,
      • 例如:语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RIP(路由信息协议,如报告股票市场,航空信息)、
      • DNS(域名解释)、注重速度流畅、UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。
      • 例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
    • 3.套接字
      • 1.简介
        • socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
        • 它能实现不同电脑间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的;例如我们每天浏览网页、QQ 聊天、收发 email 等等
      • 2.from socket import *
        • udp_socket=socket(AF_INET,SOCK_DGRAM)      创建一个可以在不同电脑之间通信的udp套接字
        • tcp_socket=socket(AF_UNIX,SOCK_STREAM)     创建一个可以在同一台电脑之间通信的tcp套接字
      • 3.实现聊天(多线程发送接收)
        • from socket import *
        • from threading import Thread
        • send_socket=socket(AF_INET,SOCK_DGRAM)  #创建发送套接字对象
        • send_socket.bind(("",9999))   #绑定端口 元组形式("ip",端口)  ip可以用""代替,如果写错自己的ip报错
        • def send_msg():
          • while True:
            • msg=input(">>")  #输入发送内容
            • send_socket.sendto(msg.encode("utf-8"),("127.0.0.1",9000))  #127.0.0.1 为接受方ip,9999为端口号必须和接收方端口一致,发送的消息需编码
            • if msg=="bye":
              • break
        • def recf_msg():
          • while True:
            • content=send_socket.recvfrom(1024)    #接收消息  1024为接收消息的容器大小(缓冲大小)
            • #content为一个元组  content[0] 为接收到的消息,content[1] 为元组 (发送方ip,发送方端口号)
            • msg=content[0].decode("utf-8") #接送到的消息需解码
            • print("<<"+msg)
            • if msg=="bye":
              • break
        • t1=Thread(target=send_msg)
        • t2=Thread(target=recf_msg)
        • t1.start()
        • t2.start()
        • t1.join()
        • t2.join()
        • #接收方与发送方代码基本一致 1.接收方绑定端口为9000与发送方发送消息的端口一致  2,接收方发送消息端口为9999与发送方绑定端口一致
    • 4:udp广播
      • 当发出一个目的地址为广播地址时,它将被分发给该网段上的所有计算机。127.0.0.1为本机回环地址 广播地址为网段的最后一位地址
      • sock对象.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)  # 发送消息声明广播类型的socket
    • 5.pack和unpack封装数据,和解包数据
      • from struct import pack,unpack
      • msg=pack("!H8sb",1,"test.jpg".encode(),2)  "!"网络传输数据,H整型代替1占两个字节,8s代替字符串test.jpg(字符串需编码),b代替0占1个字节
      • tuple=unpack("!H8sb",msg) 解包要与封装格式一样,解包返回一个包含消息的数据(1,test.jpg,2)
    • 5.udp绑定问题
      • 一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程。
      • 客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况。
    • 6.总结
      • 1.udp协议是不可靠传输协议,不能保证到达另一端以及到达顺序。
      • 2.udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
      • 3.udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信。
      • 4.udp服务器、客户端
      • udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分。
      • 请求服务的一方称为:客户端
      • 提供服务的一方称为:服务器
  • 二、TCP编程
    • 1.特点
      • 1.TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它完成传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。
      • 在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接;
      • 2.它的可靠性体现在:3次握手建立连接,滑动窗口机制,一定的拥塞避免算法,流量控制,以及一定的超时重传机制。
      • 3.TCP提供可靠,稳定的传输(三次握手,数据确认机制,重传机制,拥塞控制),由于这些导致TCP传输效率低,速度慢(各种机制+每次连接都会消耗CPU,内存等资源)
    • 2.TCP和UDP区别
      • 1.TCP面向连接---UDP面向无连接
      • 2.TCP首部20字节---UDP首部8字节
      • 3.TCP只能点对点通信---UDP可以实现一对一,一对多,多对一,多对多通信
      • 4.TCP使用字节流传输---UDP使用报文传输
      • 5.TCP提供可靠,稳定的传输(三次握手,数据确认机制,重传机制,拥塞控制),由于这些导致TCP传输效率低,速度慢(各种机制+每次连接都会消耗CPU,内存等资源)---UDP提供不可靠,不稳定的传输(网络不好容易丢包),但传输效率高,速度快
    • 3.实现聊天(服务端和客户端)
      • #服务端
      • from socket import *
      • from threading import currentThread,Thread
      • sock=socket(AF_INET,SOCK_STREAM)   #创建socket对象   SOCK_STREAM  为TCP,AF_INET 为不同电脑通信,
      • sock.setsocket(SOL_SOCKET,SO_REUSEADDR,1) # 设置程序关闭,端口释放快一点(防止出现程序重新启动,出现端口被占用)
      • sock.bind(("",9900)) #绑定端口
      • sock.listen(3)  # 设置监听模式等待客户端的链接
      • def recf_msg():  #接收消息线程
        • while True:
          • msg=recf_sock.recv(1024) #设置接收容器缓冲大小,使用新的socket对象接收消息
          • print(">>"+msg.decode("utf-8"))  #消息解码
      • def send_msg(): #发送消息线程
        • while True:
          • msg=currentThread().name+":"+input(">>")
          • recf_sock.send(msg.edcode("utf-8")) #使用新的socket对象发送消息编码
      • while True:
        • recf_sock,send_adress=sock.accept()  #等待链接,当有链接的时候解除阻塞,并且返回新的socket对象和对应的地址
        • Thread(target=recf_msg).start()
        • Thread(target=send_msg,name="服务器").start()
      • #客户端
      • from socket import *
      • from threading import currentThread,Thread
      • sock_send=socket(AF_INET,SOCK_STREAM)
      • sock.content(("127.0.0.1"),9900)  #tcp三次握手链接服务器,127.0.0.1为服务器ip(这儿使用本机测试),链接端口与服务器一样
      • def send_msg(): #发送消息线程
        • while True:
          • msg=currentThread().name+":"+input(">>")
          • sock_send.send(msg.edcode("utf-8")) #消息编码
      • def recf_msg():  #接收消息线程
        • while True:
          • msg=sock_send.recv(1024) #设置接收容器缓冲大小,接收消息
        • print(">>"+msg.decode("utf-8"))  #消息解码
      • t1=Thread(target=recf_msg)
      • t2=Thread(target=send_msg,name="客户端")
      • t1.start()
      • t2.start()
      • t1.join()
      • t2.join()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值