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输出带颜色:\033[32m  CODE  \033[0m ——输出不带背景色    \033[32;41m   CODE  \033[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':'\033[32m','金老板':'\033[33m','晓雪':'\033[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 \033[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

posted @ 2020-03-11 22:42  红叶楠木  阅读(187)  评论(0编辑  收藏  举报