zoukankan      html  css  js  c++  java
  • python学习Day30--tcp和udp协议+PyCarm带颜色输出

    【基本知识点】

    1、回顾:

    (1)架构:C/S 客服端和服务器

           B/S 浏览器和服务器   优点:统一的应用的接口

    (2)通信:

      同一台计算机两个py文件通信:打开一个文件

      两台计算机之间通信:一根网线

      多个计算机之间通信:交换机

      【注】交换机的通信方式:①广播;②单播(一对一);③组播(一对多)

      更多个计算机之间的通信:交换机+路由器 

    (3)mac地址:物理地址,全球唯一,类似于一个人的身份证。

    (4)IP地址:逻辑地址,四位点十进制,类似于一个人的学号。

    (5)端口:操作系统为本机上的应用程序随机分配的一个接口。(0~65535,0~1023不能用)

    (6)网段:一个局域网内IP地址的范围

    (7)子网掩码:用来计算网段。子网掩码&P地址=网段

    (8)arp协议:通过目标IP地址获取目标mac地址的一个协议。

    (9)OSI五层模型:

      物理层:光纤,集线器,网线                     

      数据链路层:交换机、网卡、网桥                arp协议

      网络层:路由器,三层交换机                       IP协议

      传输层:四层交换机,四层路由器               UDP, TCP

      应用层:                                                      http, https, ftp

    (10)TCP协议的编码流程

      服务器端:                                                  客服端:

        实例化对象                                                  实例化对象

        绑定IP地址和端口号

        监听

        接收客服端的连接                                       连接客服端

        收发                                                             收发

        关闭                                                             关闭

    2、TCP协议完善编码

     1 # *******************服务端**********************开始
     2 import socket
     3 
     4 sk = socket.socket()# 默认参数  使用基于网络类型的套接字,TCP协议
     5 sk.bind(('127.0.0.1',65534))# 回环地址
     6 sk.listen()
     7 while 1:
     8     conn,addr = sk.accept()# 接电话
     9 
    10     while 1:
    11         msg_r = conn.recv(1024).decode('utf-8')
    12         print(msg_r)
    13         if msg_r == 'q':
    14             break
    15         msg_s = input('>>>')
    16         conn.send(msg_s.encode('utf-8'))
    17         if msg_s == 'q':
    18             break
    19 
    20     conn.close()
    21 sk.close()
    22 # *******************服务端**********************结束
    23 
    24 # *******************客服端**********************开始
    25 import socket
    26 
    27 sk = socket.socket()
    28 sk.connect(('127.0.0.1',65534))
    29 while 1:
    30     msg_s = input('>>>')
    31     sk.send(msg_s.encode('utf-8'))
    32     if msg_s == 'q':
    33         break
    34     msg_r = sk.recv(1024).decode('utf-8')
    35     if msg_r == 'q':
    36         break
    37     print(msg_r)
    38 
    39 sk.close()
    40 # *******************客服端**********************结束
    TCP协议编码完善

    conn,addr = sk.recv()和conn.close()中的相关问题

    (1)建立连接——三次握手

    (2)断开链接——四次挥手

     3、UDP协议+Pycharm输出带颜色

    type = socket.SOCKET.DGRAM

    优势:允许一个服务器同时和多个客服端通信

    PyCharm输出带颜色:33[32m  CODE  33[0m ——输出不带背景色    33[32;41m   CODE  33[0m——带背景色

     1 # *******************服务端**********************开始
     2 import socket
     3 
     4 sk = socket.socket(type=socket.SOCK_DGRAM)# udp协议
     5 sk.bind(('127.0.0.1',8090))
     6 # 需求: 根据每个客户端的名字,去加上颜色
     7 dic = {'alex':'33[32m','金老板':'33[33m','晓雪':'33[35m'}
     8 
     9 # 收发
    10 while 1:
    11     msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息
    12     # 消息     alex : 我是SB
    13     msg_r = msg_r.decode('utf-8')
    14     name = msg_r.split(':')[0].strip()
    15     color = dic.get(name,'')# get(key,default)  获取字典中key对应的value,如果没有key则返回default
    16     print('%s %s 33[0m'%(color,msg_r))
    17     msg_s = input(('>>>'))
    18     sk.sendto(msg_s.encode('utf-8'),addr)# 发给谁的消息
    19 
    20 sk.close()
    21 # *******************服务端**********************结束
    22 
    23 
    24 # *******************客服端**********************开始
    25 import socket
    26 
    27 sk = socket.socket(type=socket.SOCK_DGRAM)# udp协议
    28 
    29 
    30 name = input('请输入您的名字:')
    31 # 收发
    32 while 1:
    33     msg_s = input(('>>>'))
    34     info = name + ' : ' + msg_s
    35     sk.sendto(info.encode('utf-8'), ('127.0.0.1',8090))  # 发给谁的消息
    36     msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息
    37     print(msg_r.decode('utf-8'))
    38 
    39 
    40 sk.close()
    41 # *******************客服端**********************结束
    UDP协议+PyCharm带颜色输出

    4、自定义类继承socket类

    【注】解决编码解码的问题

     1 # *******************自定义继承socket类**********************开始
     2 import socket
     3 
     4 
     5 class MySocket(socket.socket):# 继承自 socket文件中的socket类,此时socket就是父类
     6     def __init__(self,encoding='utf-8'):
     7         self.encoding = encoding
     8         super(MySocket, self).__init__(type=socket.SOCK_DGRAM)#  执行父类socket中的__init__方法
     9 
    10     def my_sendto(self,msg,addr):
    11         return self.sendto(msg.encode(self.encoding),addr)# 调用父类中的sendto方法
    12 
    13     def my_recvfrom(self,num):
    14         msg_r,addr = self.recvfrom(num)# 调用父类的recvfrom方法
    15         return msg_r.decode(self.encoding),addr
    16 # *******************自定义继承socket类**********************结束
    自定义继承socket类

    时间:2020-03-11    22:39:53

    作者(QQ):931935931

  • 相关阅读:
    sql2008存储过程 "see object explorer details for objects in this folder"问题
    wcf寄宿iis7是的 500错误
    如何绑定到根元素的数据源
    实用sql语句
    網絡相關知識隨記
    MSSQL跨服務器複製數據
    javascript typeof 和 instanceof 的区别和联系[轉]
    读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
    MSSQL觸發器注意事項
    Ext.net注册前台脚本
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12465047.html
Copyright © 2011-2022 走看看