python-网络编程-socket编程
一、TCP\IP(网络通信协议)简介
TCP:(Transmission Control Protocol)传输控制协议,面向有连接的通信协议
UDP:数据报文协议,面向无连接的通信协议
IP:(Internet Protocol)网际协议
二、socket语法
网络七层模型(OSI模型)
1物理层——>2数据链路层(mac地址)——>3网络层(IP)——>4传输层(TCP/IP 、UDP协议传输)——>5会话层——>6表示层——>7应用层(http、ftp、smtp、pop3)
socket语法及相关知识点:
socket是为两个程序之间建立一个双向通道,来实现数据传输。 网络通信是通过ip+port来定位具体的目标机器的具体的服务,操作系统有0-65535个端口,每个端口独立对外提供服务。
建立一个socket必须有两个端:服务端和客户端
服务端:被动等待接受客户端的请求
建立流程:1.建立一个socket实例sk——>sk.bind()设置服务端可监听的网络地址和端口号——>sk.listen()开始监听——>
cnn,val=sk.accepr()接受客户端的连接——>cnn.recv()接受数据——>cnn.send()发送数据——>close
1、建立一个socket实例 :socket.socket()
- import socket
- server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
第一个参数为:地址簇
socket.AF_INET ipv4
socket.AF_INET6 IPV6
socket.AF_UNIX unix本机进行之间通信
第二个参数:socket类型
socket.SOCKET_STREAM for tcp
socket.SOCKET_DGRAM for udp
socket.
SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.
SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
2、 绑定地址:sk.bind(address)
address的格式取决于地址簇,如果是IPV4,则以元祖的形式传入地址
- server.bind(('0.0.0.0',8001))
3、开始监听:sk.listen(backlog)
开始监听传入的连接,backlog表示在拒绝连接之前,可挂起的最大连接数,backlog最大为5
- server.listen(5)
4、接收连接并返回新套接字对象和客户端地址
- cnn,client_addr=server.accept()
cnn为新的套接字对象,clinet为连接的客户端地址
5、接受和发送客户端数据
- cnn.recv(1024)
- cnn.send(b'got your msg')
客户端:主动向服务端发送请求
流程:建立一个socket实例c——>c.connect()连接服务端——>c.send()发送数据——>c.recv()接受数据——>c.close()
- import socket
- client=socket.socket() # 1、建立socket实例
- client.connect(('localhost',8001)) #2、连接
- msg=input('>>:')
- client.send(msg.encode()) #3、发送数据
- print('send:%s' %msg)
- data=client.recv(1024)
- print('receive from server:%s'%data) #4、接受数据
下面是小练习:
服务端:
- import socket
- server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- server.bind(('127.168.0.1',8001))
- server.listen(5)
- print('------------start to listen--------')
- while True: #客户端断开与服务端的连接时,防止直接跳出第二个循环后,报错,而是回到该循环,重新接受其他客户端的请求
- cnn,client_addr=server.accept()
- print(cnn,client_addr)
- while True:
- try:
- data=cnn.recv(1024) #有一个客户端断开连接是,recv不到连接,会报错,用try来进行异常处理,防止程序终止
- print('客户端:%s'%data)
- s_data=input('服务端:')
- cnn.send(s_data.encode())
- except ConnectionResetError as e:
- print(e)
- break
客户端:
- import socket
- client=socket.socket()
- client.connect(('127.168.0.1',8001))
- while True:
- msg=input('客户端:')
- client.send(msg.encode())
- # print('send:%s' %msg)
- data=client.recv(1024)
- print('服务端:%s'%data)
三、SocketServer网络服务器框架
ScoketServer可实现多线程的网络服务,它包括5个服务类:
BaseServer:不直接对外服务,是一下四个服务类的基类
TCPServer:处理tcp协议的网络传输
UDPServer:处理udp协议的网络传输
UnixStreamServer:继承TCPserver,用于unix平台,实现进程间的通信
UnixDatagramServer:继承UDPServer,用于unix平台,实现进程间的通信
一、创建一个tcp协议的socketserver
1、首先定义一个类,继承socketserver.BaseRequestHandler,重写该类中的handle方法
handle方法封装的是服务端和客户端的交互体
- import socketserver
- class MYTCPHander(socketserver.BaseRequestHandler):
- def handle(self): #封装服务端和客户端的交互体,即accept之后的内容:recv send这些,不包括listen
- while True:
- try:
- self.data=self.request.recv(1024).strip() #self.request:套接字 即cnn,client_addr=server.accept()中的cnn
- # print(self.client_address) # 打印客户端的IP和端口号 print(self.data.decode()) self.request.send(b'got your msg') except Exception as e: print(e)
2、创建一个server实例
绑定服务的地址和端口号,创建一个TCPServer实例,并开始监听和处理客户端的请求
- if __name__=='__main__':
- HOST,PORT='0.0.0.0',9999
- server=socketserver.TCPServer((HOST,PORT),MYTCPHander) #创建一个tap类型的socketserver实例,每连接一个客户端就会生成一个实例(注意不是说每次客户端发送数据)
- server.serve_forever() #开始监听,开始处理客户端的请求request
以上的脚本还是一个单线程的,如何实现多线程网络通信呢?只需要在创建socketserver实例的时候,讲socketserver.TCPServer改为socketserver.ThreadingTCPServer即可
- if __name__=='__main__':
- HOST,PORT='0.0.0.0',9999
- server=socketserver.ThreadingTCPServer((HOST,PORT),MYTCPHandler)
- print('__________________start to listen___________________')
- server.serve_forever()
使用ThreadingTCPServer后,每次进来一个连接就会生成一个线程
python-网络编程-socket编程的更多相关文章
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- Python 基础之socket编程(一)
Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...
- Python 基础之socket编程(二)
Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...
- Python 基础之socket编程(三)
python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Day8 - Python网络编程 Socket编程
Python之路,Day8 - Socket编程进阶 本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...
- Day10 Python网络编程 Socket编程
一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...
- Python的网络编程 Socket编程
Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯 ...
- 十三python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...
- python基础之socket编程
一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...
随机推荐
- JavaWeb之CSS详解
CSS的简介 1.CSS概述及作用 CSS:Cascading Style Sheets)是层叠样式表用来定义网页的显示效果.可以解决html代码对样式定义的重复,提高了后期样式代码的可维护性,并增强 ...
- 使用javascript生成的植物显示过程特效
查看效果:http://keleyi.com/keleyi/phtml/html5/33.htm .NET版本:http://keleyi.com/a/bjac/66mql4bc.htm 完整HTML ...
- PowerDesigner 逆向工程 Mariadb 失败
作者环境是win8.1 64位置 PowerDesigner 15, Mariadb 10+,在逆向的过程中发生错误,导致只能逆向出表对象,但是表对象中的字段信息确实没有的. 错误信息中的一部分是: ...
- js限制文本框只能输入数字方法小结
有时需要限制文本框输入内容的类型,本节分享下正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等代码. 例如,输入大于0的正整数 代码如下: <input onkeyup="i ...
- SharePoint 2013 自定义扩展菜单(二)
接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomA ...
- eclipse启动时报错 Could not create the java virtual machine
eclipse启动的时候 报错 这是系统为eclipse分配的内存不足,需要去修改 eclipse.ini文件 eclipse.ini是eclipse 内存分配之类的配置文件 对java虚拟机的 ...
- ButterKnife基本使用
ButterKnife基本使用 Butter Knife处理字段和方法绑定. 重要更新: 目前(2016.4.29), ButterKnife的最新版本是8.0.1. Demo项目已更新: htt ...
- jQuery修改class属性和CSS样式
jQuery修改class属性和CSS样式 class属性修改 类属性即class属性,规定类名. 用类选择器规定样式的时候,需要为元素指定类名,即class属性的值. 注意每个HTML元素只有一个c ...
- Activity详解一 配置、启动和关闭activity
先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...
- 在访问jsp时抛java.lang.IllegalArgumentException: Page directive: invalid value for import的原因
问题:java.lang.IllegalArgumentException: Page directive: invalid value for import 环境:tomcat 7.0.65 出错原 ...