Python 中的TCP与UDP编程

计算机网络通信的分层架构:

Socket套接字是网络通讯中经常使用的一种方式,通过这种方式来指定对应的协议,比方说TCP/UDP,以供用户选择。

我们可以将Socket比作一个物流公司,而TCP、UDP就像不同的物流服务。

TCP就类似顺丰。

当你要寄东西出去的时候,TCP会和收件方说:你的朋友要寄东西给你,你要要收吗?

当收件方应许后,就会问TCP什么时候发,几时可以到

TCP就会说,现在就发,大概一天后到。

这就是TCP中很著名的三次握手,相比于UDP来说,TCP较为稳健,它需要获得收件方的应答,才开始进行通信。

当发送信息完成,需要断开通信时。就会大致进行一下的会话:

物流:你好,货物已发送,请注意查收

你朋友:好的。

货物送到,你朋友:OK,货物收到,你们可以结案

物流:好的,我结案了。

这以上四个步骤就是所谓的四次挥手。


创建TCP服务端需要五个步骤:

  • 1.创建套接字并绑定到本地的IP和端口。
  • 2.连接成功后,开始监听。
  • 3.进入While Tue循环,不断接受客户端的请求。
  • 4.接收客户端的数据,并将自身的数据发送过去。
  • 5.传输完成后关闭套接字。

TCP是面向连接的通信,也就是发送之前要进行连接;此外,TCP是拥有拥塞机制的,如果当前的数据没有被完全接收完毕,那么后面的数据就会阻塞直到前面的数据传递结束。

通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;在数据完整性、安全性要求较高的场景需要使用TCP协议,比如你传送重要办公文件、图片等,这些东西丢包都是会影响数据品质的。

TCP的创建需要耗费很大的资源,并且由于它的拥塞机制的存在,如果出现拥塞,那么数据传输就会出现较大的延迟,比如视屏通话的时候会出现卡顿。而创建UDP客户端就比较简单,没有TCP那么耗费资源,以及创建的复杂。只需要三个步骤就可以与服务端进行交互:

  • 1.创建套接字,连接远程的地址。
  • 2.连接成功后,与服务端进行收发数据。
  • 3.传输完成后关闭套接字。

因此,当我们传输少量数据或者传输要求实时性的数据时,就会使用UDP协议来传输。比如视频实时会议。

网络编程的Python实现:

import socket
import threading
import time
import random


def ServerThread(sock, addr):
    print('Now is connecting from %s...%s' % addr)
    sock.send(b'Hello world, i am server')
    while True:
        data = sock.recv(1024)
        time.sleep(random.random())
        if not data or data.decode('utf-8') == 'exit':
            break
        print('data -->>' % data.decode('utf-8').encode('utf-8'))
        sock.send(data.decode('utf-8').encode('utf-8'))
    sock.close()
    print('connect from %s is closed' % addr)

if __name__ == '__main__':
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('127.0.0.1', 8889))
    s.listen(5)
    print('waiting for connecting...')
    while True:
        sock, addr = s.accept()
        t = threading.Thread(target = ServerThread, args = (sock, addr))
        t.start()
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8889))
for i in range(5):
    print('---> %s' %s.recv(1024).decode('utf-8'))
    s.send(b'hello wrold, i am client')
    print('---> %s' %s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值