TCP UDP粘包和进程部分

本文深入探讨了TCP和UDP两种网络协议的特点与应用。通过对比分析,详细解释了TCP的可靠性及半连接池工作原理,以及UDP的高效传输特性。同时,提供了实际的Python代码示例,帮助读者理解如何在具体场景中使用这两种协议。

TCP 半连接池原理

#客户端
import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(("127.0.0.1",9999))

while True:
        data = input(">>>:")
        if not data:continue
        client.send(data.encode("utf-8"))
        msg = client.recv(1024).decode("utf-8")
        print(msg)

client.close()

#服务器
import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(("127.0.0.1",9999))
#  不是最大连接数  !!
server.listen(5)

while True:
    c,addr = server.accept()
    while True:
        try:
            msg = c.recv(1024).decode("utf-8")
            if not msg:
                c.close()
                break
            c.send(msg.upper().encode("utf-8"))
        except BaseException:
            print("客户端异常断开")
            c.close()
            break
server.close()


UDP通讯

#客户端
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # datagram数据报的意思

while True:
    msg = input(">>>:")
    client.sendto(msg.encode("utf-8"),("127.0.0.1",8888))
    data,addr = client.recvfrom(1024)
    print(data.decode("utf-8"))

#服务器
import socket

# 创建socket对象  指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8888))

while True:
    # 接收数据 返回一个元祖  数据和 发送方的地址
    msg,c_addr = server.recvfrom(1024)
    print("收到来自%s: 说:%s" % (c_addr[0] ,msg.decode("utf-8")))
    # 发送数据到指定ip和端口
    server.sendto(msg.upper(),c_addr)


UDP聊天

#客户端
import socket

c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    msg = input(">>>:")
    c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))
    msg, addr = c.recvfrom(1024)
    print(msg.decode("utf-8"))

#服务器
"""
    群聊思路
        1.客户端先把数据交给服务器
        2.服务器先存储对方的地址
        3.把收到的数据给所有人都发一遍

"""


import socket

server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

server.bind(("127.0.0.1",8848))


# 如果客户端与服务器在同一台计算机  并且有多个客户端  这些客户端ip都是相同的127.0.01

clients = {}

while True:
    msg,addr = server.recvfrom(1024)

    # 存储对方的地址:
    clients[addr[1]] = addr

    print(msg.decode("utf-8"))
    # 循环发给所有人
    for c in clients:
        # 这个消息不用给发送方发回去
        # if c == addr[1]:
        #     continue
        server.sendto(msg,clients[c])

UDP聊天2

#发送机
import socket

c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    msg = input(">>>:")
    c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))

#接收机
import socket

c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 先随便发一条消息给服务器  让服务知道自己的地址
c.sendto("register".encode("utf-8"),("127.0.0.1",8848))

while True:
    msg, addr = c.recvfrom(1024)
    print(msg.decode("utf-8"))

#服务器
"""
    群聊思路
        1.客户端先把数据交给服务器
        2.服务器先存储对方的地址
        3.把收到的数据给所有人都发一遍

"""


import socket

server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

server.bind(("127.0.0.1",8848))


# 如果客户端与服务器在同一台计算机  并且有多个客户端  这些客户端ip都是相同的127.0.01

clients = {}

while True:
    msg,addr = server.recvfrom(1024)

    # 存储对方的地址:
    clients[addr[1]] = addr

    print(msg.decode("utf-8"))
    # 循环发给所有人
    for c in clients:
        # 这个消息不用给发送方发回去
        # if c == addr[1]:
        #     continue
        server.sendto(msg,clients[c])

UDP会粘包吗?

1.UDP 不会粘包
2.缓冲区大小要足够装数据包大小 建议不要超过512

UDP的使用场景: 视频电话 语音电话 直播

DNS 域名解析服务器

#客户端
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # datagram数据报的意思
client.sendto("10".encode("utf-8"),("127.0.0.1",8888))
client.sendto("22".encode("utf-8"),("127.0.0.1",8888))
client.sendto("32".encode("utf-8"),("127.0.0.1",8888))
client.sendto("43".encode("utf-8"),("127.0.0.1",8888))


# while True:
    # msg = input(">>>:")
    # client.sendto(msg.encode("utf-8"),("127.0.0.1",8888))
    # data,addr = client.recvfrom(1024)
    # print(data.decode("utf-8"))

#服务器
import socket

# 创建socket对象  指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8888))

while True:
    # 接收数据 返回一个元祖  数据和 发送方的地址
    msg,c_addr = server.recvfrom(512)
    print("收到来自%s: 说:%s" % (c_addr[0] ,msg.decode("utf-8")))
    # 发送数据到指定ip和端口
    server.sendto(msg.upper(),c_addr)


UDP总结

1.TCP模板代码
半连接池的工作原理
目前我们的程序是单线程 服务器要么处理通讯要么处理连接请求 无法同时进行

2.TCP 和 UDP 发送数据时的流程 *****
解释 为何TCP是可靠的 是因为发送数据后必须收到确认包

  1. UDP的模板代码 *****
    与TCP代码的区别
    不需要监听 不需要接收
    type参数为 SOCK_DGRAM
    UDP 可以同时处理多个客户端 是因为CPU处理速度快 给人感觉像是同时处理

什么是进程

什么是进程
正在进行(运行)的程序
在只有一个CPU的情况下
是因为有多道技术
内存被分为多个区域 存放不同的应用程序
当一个应用程序遇到了I/O操作时 操作系统会将CPU分配给其他的应用程序使用
切换的时间非常短 用户是感觉不到的
特点:
一个操作系统中可以同时存在多个进程
内部使用了多道技术 可以快速在不同进程间切换 给用户的感觉像是同时运行
进程是一个包含程序运行所需的所有资源的单位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值