Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

今日内容:socket网络编程
    1.OSI七层协议
    2.基于tcp协议的套接字通信
    3.模拟ssh远程执行命令
    4.tcp的粘包问题及解决方案
    5.基于udp协议的套接字通信
    6.socketserver

目标:开发一个C/S架构的软件
C/S:客户端----》server
B/S:浏览器----》server
server端:
    1.位置必须固定/绑定一个固定的地址
    2.对外一直提供服务,稳定运行
    3.支持并发(让多个客户端感觉时被同时服务)
网络:
    物理连接介质+互联网协议
    ip+port可以标识全世界范围内独一无二的应用软件(基于网络通信协议)
    任何的数据报应该分为报头+数据部分。其中报头是用来描述数据的,报头的长度是固定的

 1 #client
 2 import socket
 3 #1.买手机
 4 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp 流式=>SOCK_STREAM
 5 #2.拨号
 6 phone.connect(('127.0.0.1',8080)) #ip和端口应该是服务的IP和端口
 7 #3.发收消息
 8 while True:
 9     msg=input('Please input send msg:').strip()
10     phone.send(msg.encode('utf-8')) #必须是bytes类型
11 
12     data=phone.recv(1024)
13     print('服务端消息',data)
 1 #Server
 2 import socket
 3 #1.买手机
 4 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp 流式=>SOCK_STREAM
 5 #2.插SIM卡
 6 phone.bind(('127.0.0.1',8080)) #ip 应该是服务端该软件运行机器的IP地址,port(最好1024-65535)
 7 #3.开机
 8 phone.listen(5) #半连接池限制的是同一时刻的请求数
 9 print('服务端启动。。。')
10 #4.等待电话连接的请求
11 conn,client_addr=phone.accept() #(套接字对象,存放客户端IP和端口的元组)
12 print('====>')
13 print(conn,client_addr)
14 #5.收发消息
15 while True:
16     data=conn.recv(1024) #1024单位是bytes, 代表最大接收1024 bytes
17     print('收到消息',data)
18     conn.send(data.upper())
19 #6.挂电话
20 conn.close()
21 #conn.send()
22 #7关机
23 phone.close()

输出:
服务端启动。。。

1 #异常是程序发生错误的信号,一旦程序出错
2 try:
3     l=[1,2,3]
4     #if 100< len(l):
5     l[100]
6     print('aa')
7 except IndexError:
8     print('索引超出范围')
9 print('other code')

输出:
索引超出范围
other code

 1 #client优化
 2 import socket
 3 #1.买手机
 4 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp 流式=>SOCK_STREAM
 5 #2.拨号
 6 phone.connect(('127.0.0.1',8080)) #ip和端口应该是服务的IP和端口
 7 #3.发收消息
 8 while True:
 9     msg=input('Please input send msg:').strip()
10     phone.send(msg.encode('utf-8')) #必须是bytes类型
11 
12     data=phone.recv(1024)
13     print('服务端消息',data)
 1 #server 优化
 2 import socket
 3 #1.买手机
 4 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp 流式=>SOCK_STREAM
 5 #2.插SIM卡
 6 phone.bind(('127.0.0.1',8080)) #ip 应该是服务端该软件运行机器的IP地址,port(最好1024-65535)
 7 #3.开机
 8 phone.listen(5) #半连接池限制的是同一时刻的请求数
 9 print('服务端启动。。。')
10 #4.等待电话连接的请求
11 conn,client_addr=phone.accept() #(套接字对象,存放客户端IP和端口的元组)
12 print('====>')
13 print(conn,client_addr)
14 #5.收发消息
15 while True:
16     try:
17         data=conn.recv(1024) #1024单位是bytes, 代表最大接收1024 bytes
18         if len(data) == 0:break # for linux/MAC
19         print('收到消息',data)
20         conn.send(data.upper())
21     except ConnectionResetError: # for windows
22         break
23 #6.挂电话
24 conn.close()
25 #conn.send()
26 #7关机
27 phone.close()
1 import os
2 res=os.system('dir')
3 print('结果',res)

输出:
结果 0

1 import subprocess
2 import time
3 obj=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
4 #print (obj)
5 stdout=obj.stdout.read()
6 
7 print(stdout.decode('gbk'))
8 stdout=obj.stdout.read()
9 time.sleep(0.1)

输出:

驱动器 C 中的卷是 OS
卷的序列号是 E0C1-2532

C:Usersandy 的目录

2018/08/26  17:40    <DIR>          .
2018/08/26  17:40    <DIR>          ..
2018/03/20  22:28    <DIR>          .anaconda
2017/07/29  20:27    <DIR>          .android
2018/05/25  22:20    <DIR>          .astropy
2018/03/21  00:17    <DIR>          .conda
2018/05/05  21:53                43 .condarc
2018/08/26  09:37    <DIR>          .ipynb_checkpoints
2018/03/20  22:27    <DIR>          .ipython
2018/05/06  17:59    <DIR>          .jupyter
2018/05/25  22:15    <DIR>          .PyCharm2016.2
2018/08/16  23:10    <DIR>          3D Objects
2018/08/05  14:44                43 a.txt
2018/03/20  22:15    <DIR>          Anaconda2
2018/05/06  16:12    <DIR>          Anaconda3
2018/05/05  21:53    <DIR>          AnacondaProjects
2018/08/05  15:21                63 b.json
2018/08/05  15:21                63 c.json
2018/08/16  23:10    <DIR>          Contacts
2018/07/29  22:32            23,933 Day06.ipynb

1 import struct
2 #可以将整形打包成固定长度的bytes类型,可以基于网络传输
3 res=struct.pack('i',21215)
4 print(res,len(res))
5 
6 res1=struct.unpack('i',res)
7 print(res1[0])

输出:
b'xdfRx00x00' 4
21215