zoukankan      html  css  js  c++  java
  • 30 tcp编码, udp编码 pycharm输出带颜色, tcp实现的聊天室

    主要内容:

      发送端一次性发送的数据,从发送端的缓存区发送给接收方的操作系统中(即缓存区),

      接收方直接要数据从自己的操作系统中,不会接收一次(在没有接收完的情况下)就像发送方要一次.从而提高了网络传输的效率.

    1. tcp协议及编码

      a : 回环地址 : 127.0.0.1   每个计算机都有这个回环地址,只能被本机识别,不能被其他机器识别.

      b : 用tcp 实现一个聊天室

        服务器端:

    import socket
    sk = socket.socket()# 默认参数  使用基于网络类型的套接字,TCP协议
    sk.bind(('127.0.0.1',65534))# 回环地址
    sk.listen()
    while 1:
        conn,addr = sk.accept()# 接电话
        while 1:
            msg_r = conn.recv(1024).decode('utf-8')
            print(msg_r)
            if msg_r == 'q':
                break                      # 如果发送q结束客户端的程序,服务器并不结束,需要在接收方加上if语句.
            msg_s = input('>>>')
            conn.send(msg_s.encode('utf-8'))
            if msg_s == 'q':               #如果接收到服务器的传来的q结束程序.
                break
        conn.close()
    sk.close()
    

        客户端:

    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',65534))
    while 1:
        msg_s = input('>>>')
        sk.send(msg_s.encode('utf-8'))
        if msg_s == 'q':
            break
        msg_r = sk.recv(1024).decode('utf-8')
        if msg_r == 'q':
            break
        print(msg_r)
    sk.close()
    

        tcp协议的三次握手 , 四次挥手:

          三次挥手 : @ 一定是客户端先发起请求

            1) :客户端发起请求: 请求连接服务器(我想连接你)

            2) :服务器返回 : 接收到请求, 并要求连接客户端

            3) :客户端 : 可以连接了.

          四次挥手: @四次挥手的过程,第一次请求谁先发送都可以

            1) :客户端发起断开连接的请求 : (我想和你断开了,我没有数据要发送了,但是,如果你有数据没发完,你就继续发就可以了,我可以继续接收)

            2) :服务器回复 : 我接收到你的请求了,我马上着手准备断开

            3) :服务器回复 : 我已经准备好断开连接了.

            4) :客户端回复 : 收到你的信息,可以断开了.

      c : pycharm输出带颜色

        1) : 格式设置颜色开始 :33[前景色;背景色m

            不设置背景色 :  33[显示颜色m

        2) :格式设置结束 :           33[0m         采用终端默认设置,即取消颜色设置

        3) : 前景色:30  背景色: 40 代表黑色 31,红色  32, 绿色 33, 黄色, 34, 蓝色, 35, 紫红色, 36,青蓝色, 37白色.

    print('33[35m欢迎使用学生选课系统33[0m')
    try :
        num = int(input('请输入数字选择功能:'))
    except Exception as e:
        print('33[31m输入的内容有误,请重新输入33[0m') 
    

      d : udp协议

        服务器端 :

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8787))
    msg, addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'),addr)
    sk.close()
    

        客户端 :

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.sendto('你好a'.encode('utf-8'),('127.0.01',8787))
    sk.close()
    

        注意 : 收发信息的过程,一定是客户端先发,要不然会出现错误.即服务器端先发,不知道把信息发给谁.

        带署名的udp协议:服务器端:

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8787))
    dic = {'alex':'33[31m','sylar':'33[34m'}
    while 1:
        msg, addr = sk.recvfrom(1024)
        msg_d = msg.decode('utf-8')
        name = msg_d.split(':')[0].strip()
        color = dic.get(name, '')
        print('%s%s33[0m' % (color,msg_d))
        msg_s = input('>>>:').encode('utf-8')
        sk.sendto(msg_s, addr)
    sk.close()
    

        客户端: 

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    name = input('请输入你的姓名: ')
    while 1:
        msg_s = input('请输入聊天的内容:')
        msg_s = name + ':' + msg_s
        sk.sendto(msg_s.encode('utf-8'),('127.0.01',8787))
        msg, addr = sk.recvfrom(1024)
        print(msg.decode('utf-8'))
    sk.close()
    

      e : 解决编码解码问题

      先建一个类:

    import socket
    class MySocket(socket.socket):# 继承自 socket文件中的socket类,此时socket就是父类
        def __init__(self,encoding='utf-8'):
            self.encoding = encoding
            super(MySocket, self).__init__(type=socket.SOCK_DGRAM)#  执行父类socket中的__init__方法
    
        def my_sendto(self,msg,addr):
            return self.sendto(msg.encode(self.encoding),addr)# 调用父类中的sendto方法
    
        def my_recvfrom(self,num):
            msg_r,addr = self.recvfrom(num)# 调用父类的recvfrom方法
            return msg_r.decode(self.encoding),addr
    

      服务器端:

    from My_UDP import MySocket
    sk = MySocket()
    sk.bind(('127.0.0.1',8080))
    msg,addr = sk.my_recvfrom(1024)
    print(msg)
    sk.close()
    

      客户端:

    from My_UDP import MySocket
    sk = MySocket()
    sk.my_sendto('abcabc中国',('127.0.0.1',8080))
    sk.close()
    

      

  • 相关阅读:
    双端队列广搜
    多源bfs
    leetcode刷题-67二进制求和
    leetcode刷题-66加一
    leetcode刷题-64最小路径和
    leetcode刷题-62不同路径2
    leetcode刷题-62不同路径
    leetcode刷题-61旋转链表
    leetcode刷题-60第k个队列
    leetcode刷题-59螺旋矩阵2
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9469961.html
Copyright © 2011-2022 走看看