一、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编程的更多相关文章

  1. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  2. Python 基础之socket编程(一)

    Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...

  3. Python 基础之socket编程(二)

    Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...

  4. Python 基础之socket编程(三)

    python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...

  5. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  6. Day8 - Python网络编程 Socket编程

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  7. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

  8. Python的网络编程 Socket编程

    Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯 ...

  9. 十三python基础之socket编程

      阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...

  10. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

随机推荐

  1. Javascript:Javascript数据类型详解

    要成为一个优秀的前端工程师,系统的学习Javascript,有夯实的Javascript基础,以及对语言本身的深刻的理解,是基本功.从Javascript数据类型开始,我将对Javascript知识体 ...

  2. javascript类型系统——正则表达式RegExp类型

    × 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法 前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String ...

  3. php 7.0 安装以及老版本php删除

    一, 安装php7 php7对php5是99%的兼容, 而且性能更好, 网上很多的优秀的库都对版本有一定的要求, 所以推荐安装php7 低于ubuntu 16.04的系统默认的源不带php7, 所以需 ...

  4. Google C++单元测试框架---Gtest框架简介(译文)

    一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual ...

  5. 环信SDK报错处理方法obtain an updated library from the vendor, or disable bitcode for this target. for archit

    ld: '/Users/momo/Desktop/ThreeFingers/Pods/EaseMobSDKFull/EaseMobSDKFull/lib/libEaseMobClientSDK_arm ...

  6. Android Hack1 使用weight属性实现视图的居中显示

    本文地址:http://www.cnblogs.com/wuyudong/p/5898403.html,转载请注明源地址. 如果要实现如下图所示的将按钮居中显示,并且占据父视图的一半,无论屏幕是否旋转 ...

  7. Android Bitmap占用内存计算公式

    Android对各分辨率的定义 当图片以格式ARGB_8888存储时的计算方式 占用内存=图片长*图片宽*4字节 图片长 = 图片原始长 (设备DPI/文件夹DPI)  图片宽 = 图片原始宽(设备D ...

  8. Xcode出现( linker command failed with exit code 1)错误总结

    这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 先可以再试试一下几个方法:  1,看看是不是有新添加的文件跟之前文件 ...

  9. numpy中matrix的特殊属性

    一.matrix特殊属性解释 numpy中matrix有下列的特殊属性,使得矩阵计算更加容易 摘自 NumPy Reference Release 1.8.1 1.1 The N-dimensiona ...

  10. Ignite用户配置管理介绍

    Ignite8这款数据库性能监控.性能分析软件,不光是DBA监控.管理数据库的利器之一,开发人员也可以查看系统性能数据,下面介绍一下如何在Ignite里面配置用户权限,本文纯水文一篇,介绍简单基本的配 ...