zoukankan      html  css  js  c++  java
  • tcp/udp协议代码实现

    day 29

    一、TCP协议代码实现

    1、基础版:

    -------------socket.serve-------
    import socket
    ​
    # 买手机 默认得到是一个TCP的socket
    server = socket.socket()
    # 两行代码的效果是一样的
    # socket的家族   AF_INET
    # socket的类型
    # SOCK_STREAM 对应的是TCP     SOCK_DGRAM 对应的是UDP
    # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
    # 床架基于UDP的socket
    # server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    ​
    server.bind(("127.0.0.1",16888))  # 绑定手机卡
    server.listen() # 开始待机
    # 得到对方的socket对象与地址
    client,addr = server.accept() # 接收通话请求 # 该函数会阻塞 直到有连接请求过来
    ​
    ​
    print("==========")
    # buffersize 表示应用程序的缓冲区大小     recv其实是 从系统缓冲区读取数据到应用程序
    data = client.recv(1024)   # 该函数会阻塞 直到操作缓冲区有数据位置
    print("==========")
    ​
    -----------------socket.client----------------
    import socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",16888))
    client.send("hello 服务器".encode("utf-8"))
    ​
    print("===================")
    data = client.recv(1024)   # 该函数会阻塞 直到操作缓冲区有数据位置
    print("===================")
    print("收到服务器:%s" % data.decode("utf-8"))
    ​
    client.close()
     

    2、TPC异常处理版:

    ---------------socket.serve-------------
    import  socket
    ​
    server = socket.socket()
    server.bind(("127.0.0.1",8888))
    server.listen()
    ​
    client,addr = server.accept()
    ​
    while True:
        try:
            data = client.recv(1024)   #win状态下客户端异常关闭,会抛出错误
            if not data:               #如果是linux 不会抛出异常 会死循环收到空的数据包
                print("对方已经关闭.....")
                break
            print(data.decode("utf-8"))
            client.send(data.upper())
        except ConnectionResetError:
            print("对方异常关闭连接...")
    ​
    client.close()
    server.close()
    ​
    ---------------socket.client-------------
    import  socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",8888))
    client.send("hello".encode("utf-8"))
    data = client.recv(1024)
    print(data.decode("utf-8"))
    ​
    client.close()

    3、半连接池:

    ----------socket.serve--------
    import  socket
    ​
    server = socket.socket()
    server.bind(("127.0.0.1",8888))
    # 参数可以设置最大的半连接数   最大5个
    server.listen(5)
    ​
    import time
    while True:
        time.sleep(0.5)
    ​
    server.close()
    ​
    ---------socket.client---------import  socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",8888))
    ​
    while True:
        client.send(input(">>:").encode("utf-8"))
        data = client.recv(1024)
        print(data.decode("utf-8"))
    ​
    client.close()

    4、循环收发:

    -------------------socket.serve-----------
    import socket
    ​
    # 买手机 默认得到是一个TCP的socket
    server = socket.socket()
    ​
    # 两行代码的效果是一样的
    # socket的家族   AF_INET
    # socket的类型
    # SOCK_STREAM 对应的是TCP     SOCK_DGRAM 对应的是UDP
    # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
    # 创建基于UDP的socket
    # server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    ​
    ​
    server.bind(("127.0.0.1",16888))  # 绑定手机卡
    ​
    server.listen() # 开始待机
    # 连接循环 可以不断接受新连接
    while True:
        client, addr = server.accept()
    ​
        # 通讯循环 可以不断的收发数据
        while True:
            try:
                # 如果是windows 对方强行关闭连接 会抛出异常
                # 如果是linux 不会抛出异常 会死循环收到空的数据包
                data = client.recv(1024)
                if not data:
                    client.close()
                    breakprint("收到客户端发来的数据:%s" % data.decode("utf-8"))
                client.send(data)
            except ConnectionResetError:
                print("客户端强行关闭了连接")
                client.close()
                break
    client.close() #挂断电话
    server.close() # 关机
    ---------------socket.client--------------
    import socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",16888))
    while True:
        msg = input(">:")
        client.send(msg.encode("utf-8"))
        data = client.recv(1024)
        print("收到服务器:%s" % data.decode("utf-8"))
    client.close()

    二、UDP协议代码实现:

    ------------------socket.serve--------------
    import socket
    ​
    # UDP协议 在创建socket是 只有一个类型不同
    server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0)
    server.bind(("127.0.0.1",8888))
    ​
    while True:
        data,addr = server.recvfrom(1024) # 阻塞 直到收到数据为止
        print("收到来自%s的消息:%s" % (data.decode("utf-8"),addr[0]))
        # 返回值为 数据 和 对方ip地址 和端口号
        server.sendto(data.upper(),addr)
    ​
    print(res)
    server.close()
    ​
    ---------------socket.client1--------------
    import socket
    ​
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    ​
    while True:
        data = input(">>:").encode("utf-8")
        client.sendto(data,("127.0.0.1",8888))
        d,addr = client.recvfrom(1024)
        print(d.decode("utf-8"))
    ​
    client.close()
    ​
    ------------socket.client2--------------
    import socket
    ​
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    ​
    while True:
        data = input(">>:").encode("utf-8")
        client.sendto(data,("127.0.0.1",8888))
        d,addr = client.recvfrom(1024)
        print(d.decode("utf-8"))
    ​
    client.close()

     

  • 相关阅读:
    软件破解系列之OD中断方法
    C#获取类名为Internet_Explorer_Server控件的内容
    C#重启网卡(支持xp和win7)
    软件开发专业技术名词的解释
    一些软件设计的原则
    AntlrWorks的Open没有反应,安装JDK6即可解决
    向大家推荐《思考中医》,这本书对我来说算是中医启蒙了 无为而为
    面对富裕对于贫穷的几乎是天生傲慢我们要呐喊: 我们并不笨,我们只是穷读新科诺贝尔文学奖得主,奥尔罕·帕慕克作品有感 无为而为
    推荐一本书《罗伯特议事规则(Robert's Rules of Order) 》,也许对于想要参与管理的技术人员来说是很有用的 无为而为
    再次发布一个工作地点在上海的Biztalk专家招聘 无为而为
  • 原文地址:https://www.cnblogs.com/peng-zhao/p/10176054.html
Copyright © 2011-2022 走看看