zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ubuntu 16.04 网络配置之虚拟网卡的配置
    rabbitmq集群节点操作
    Ubuntu system zabbix-server-3.x install documentation
    PS RSS
    proxy_set_header设置Host为$proxy_host,$host与$local_host的区别
    centos 7 free 字段含义
    Linux atop 监控系统状态
    谨慎调整内核参数:vm.min_free_kbytes
    nginx反向代理http与https两种协议配置简述
    Python 获取以毫秒为单位的时间戳
  • 原文地址:https://www.cnblogs.com/dingchuan/p/9571621.html
Copyright © 2011-2022 走看看