通信协议与数据传输

半城伤御伤魂 提交于 2020-01-01 19:56:54

通信协议

TCP协议

  传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP协议

  用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

socket(套接字)

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  

数据传输

基于TCP协议的socket

  服务器端
import socket

sk = socket.socket()
sk.bind(('127.0.0.1', 2025))
sk.listen()

while 1:
    cron, addr = sk.accept()
    print('the connection from', addr)
    while 1:

        con_r = cron.recv(1024).decode('utf-8')
        print(con_r)
        if con_r == 'q':
            break
        con_s = input('>>>')
        cron.send(con_s.encode('utf-8'))
    cron.close()
sk.close()
  客户端
import socket
sk=socket.socket()

sk.connect(('127.0.0.1',2025))
while 1:


    con_s=input('>>>')
    sk.send(con_s.encode('utf-8'))

    if con_s=='q':
        break
    con_r=sk.recv(1024).decode('utf-8')
    print(con_r)
    if con_r=='q':
        break

sk.close()

基于UDP协议的socket

  服务器端
import socket

sk = socket.socket(type=socket.SOCK_DGRAM)# udp协议
sk.bind(('127.0.0.1',8090))

# 收发
while 1:
    msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息
    print(msg_r.decode('utf-8'))
    msg_s = input(('>>>'))
    sk.sendto(msg_s.encode('utf-8'),addr)# 发给谁的消息

sk.close()
  客户端
import socket

sk = socket.socket(type=socket.SOCK_DGRAM)# udp协议


name = input('请输入您的名字:')
# 收发
while 1:
    msg_s = input(('>>>'))
    info = name + ' : ' + msg_s  #因为udp协议是不连接的 所以发送的时候可以加上名字
    sk.sendto(info.encode('utf-8'), ('127.0.0.1',8090))  # 发给谁的消息
    msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息
    print(msg_r.decode('utf-8'))


sk.close()

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!