Python网络编程day-1[异常处理,socket]

异常处理:

  错误:

    1.语法错误:程序运行检测到语法错误会直接抛出,并终止程序运行。

    2.逻辑错误:程序在运行中遇到逻辑错误,系统会询问程序是否处理异常,程序没有处理系统会抛出异常,并终止程序运行。

  异常:

    程序运行过程中发生的错误。

  异常分为三部分:

    追踪信息,异常类,异常值。

n = input(‘>>>: ‘).strip()
s = n + 1
print(s)

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py
>>>: 1
Traceback (most recent call last):
  File "E:/Python/DAY-23/day23.py", line 7, in <module>   <----追踪信息
    s = n + 1
TypeError: must be str, not int
异常类      异常值
Process finished with exit code 1

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

  异常的处理方式:

    1.if 处理:错误发生前处理,防止错误发生

    2. try处理:错误发生后处理,捕捉异常进行处理

try的用法:

  当try含多个异常时,当遇到第一个异常就会跳出try内的代码执行,去匹配except的异常处理。

  使用try 和 except  来包裹可能发生错误的代码,使用except 来指定捕捉的 错误类型  如下代码:

try:
    n = input(‘>>>: ‘).strip()
    s = n + 1
    print(s)
except TypeError:
    print(‘-------------‘)

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py
>>>: 1
-------------

Process finished with exit code 0

支持分支捕捉异常,类似if elif

else:当try内的代码没有异常时则执行 else 后面的命令。

finally:不管try内的代码有没有异常发生都执行

s1 = ‘hello‘
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#except Exception as e:
#    print(e)
else:
    print(‘try内代码块没有异常则执行我‘)
finally:
    print(‘无论异常与否,都会执行该模块,通常是进行清理工作‘)

主动抛出异常(raise):

  主动抛出一个指定的类型的错误。

try:
    n = input(‘>>>: ‘).strip()
    s = int(n) + 1
    raise TypeError
except TypeError:
    print(‘----raise 抛出的 Type Error---------‘)

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-23/day23.py
>>>: 1
----raise 抛出的 Type Error---------

Process finished with exit code 0

自定义异常类:

class LdslyError(BaseException):   #定义错误类型的名字,继承 BaseException
    def __init__(self,msg):
        self.msg=msg

try:
    raise LdslyError(‘test‘)
except LdslyError as e:
    print(e)

socket:

  客户端/服务端架构

    即C/S架构。程序分为两部分,客户端和服务端两部分,客户端向服务端发送请求,服务端给客户端回应相应的信息。通过网络来连接客户端和服务端两部分。

  socket在计算机的什么位置:

socket的工作流程:

  上图 write和read形成的循环,称为通信循环。

一个简单的客户端发送命令,服务端执行命令并返回命令的执行结果:

#服务端import socket
import subprocess

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #建立服务
server.bind((‘127.0.0.1‘,8080))   #监听IP和端口
server.listen(5)

print(‘server run..........‘)

while True:
    conn,client_addr=server.accept()  #等待客户端连接,建立连接对象conn
    print(client_addr)   #打印客户端连接信息
    while True:
        try:
            client_msg = conn.recv(1024)   #接收客户端消息
            res = subprocess.Popen(client_msg.decode(‘utf-8‘),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            stdout = res.stdout.read()
            stderr = res.stderr.read()
            conn.sendall(stdout+stderr)
            print(client_msg.decode(‘utf-8‘))   #打印客户端消息
            # conn.send(‘hi‘.encode(‘utf-8‘))   #发送给客户端消息
        except Exception:
            break
    conn.close()   #关闭连接

server.close()   #关闭服务
#客户端
import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #建立客户端

client.connect((‘192.168.16.108‘,8080))   #客户端连接 服务端的ip地址跟端口
while True:
    cmd = input(‘>>>:‘).strip()
    if not cmd:break
    client.send(cmd.encode(‘utf-8‘))  #向服务端端发送信息

    server_msg = client.recv(1024)   #接受服务端的回复
    print(server_msg.decode(‘gbk‘))  #打印服务端信息

client.close()   #关闭连接
时间: 2024-10-14 12:32:03

Python网络编程day-1[异常处理,socket]的相关文章

python网络编程,通过服务名称和会话类型(tcp,udp)获取端口号,简单的异常处理

作为一个php程序员,同时有对网络方面感兴趣,php就比较蛋疼了,所以就抽了些时间看python 之前学python基础因为工作原因,断断续续的看了个基础,差不多是可以写代码了 最近在看<python网络编程基础>,准备是边实践边学习了,对书上的一个例子做了个复制 cli下运行的代码 1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # ^设置编码:代码中有中午会导致编译错误 4 5 # 引入socket,sys模块 6 import so

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

python网络编程——socket进阶篇(select/poll/epoll)

原 生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收数据(调用recv)时也是阻塞的.原生 socket服务端在同一时刻只能处理一个客户端请求,即服务端不能同时与多个客户端进行通信,实现并发,导致服务端资源闲置(此时服务端只占据 I/O,CPU空闲). 现在的需求是:我们要让多个客户端连接至服务器端,而且服务器端需要处理来自多个客户端请求.很明显,原生socket实现不了这种需求,此时我们该采用什么方式来处理呢? 解决方法:采用I/O多路复

python 网络编程:socket

在学习socket之前,我们先复习下相关的网络知识. OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.OSI七层模型是由国际标准化组织ISO定义的网络的基本结构,不仅包括一些概念和结构,还包括一系列的协议. TCP/IP四层模型:既然有OSI七层模型,为什么我们还要定义一个TCP/IP的四层模型呢,那是因为OSI七层模型对应面过于宽泛,很多概念实现不了,也没必要实现,因此,实际生产中广泛应用的是TCP/IP四层结构,他们的对应关系如下表: TCP/IP OSI 应用层

python 网络编程:socket和select实现伪并发

上节地址:Python网络编程:socket 先补充点内容: 一.send和sendall区别 send,sendall ret = send('safagsgdsegsdgew') #send 发送完成后会有一个返回值,告知发送了多少,并不一定会把数据全部发送过去. sendall:内部调用send,将数据全部发送完为止. 因此我们使用时最好使用sendall 二.粘包 粘包问题需要理解recv()的使用,我们定义接收值的时候会写recv(1024)表示一次接收1024字节,但是有时候接收的数

python 网络编程(Socket)

# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_response(status='200 OK',headers=[('Content-Type','text/html')])# url=environ['PATH_INFO']## return "guozhendong"## if __name__=='__main__':# httpd=m

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

[Python网络编程] DNS缓存解决方案

记得以前写爬虫的时候为了防止dns多次查询,是直接修改/etc/hosts文件的,最近看到一个优美的解决方案,修改后记录如下: import socket _dnscache={} def _setDNSCache(): """ Makes a cached version of socket._getaddrinfo to avoid subsequent DNS requests. """ def _getaddrinfo(*args, **

Python 网络编程

Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyt