python之Socket网络编程详解

什么是网络?

网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型。在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。网络是人类发展史来最重要的发明,提高了科技和人类社会的发展。

网络通信的三要素

IP地址
用来表示一台独立的主机
特殊的IP地址 127.0.0.1或称localhost(表示本地回环地址,保留地址等),可用于本机测试

端口号
要将数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这些数字,则将这些数字称为端口

传输协议
TCP协议:传输控制协议
面向连接:传输之前需要建立连接
在连接过程中进行大量数据传输
通过三次握手方式连接,属于安全可靠连接
传输速率慢,效率低
UDP协议:用户传输协议
面向无连接:传输过程不需要建立连接即可传输
每个数据传输的大小都限制在64K以内
传输过程不可靠
传输速率快,效率高

SOCKET网络编程

如简单的实现一个WEB小程序

import socket
def handle_request(client):
 buf = client.recv(1024)
 client.send(bytes("HTTP/1.1 200 OK\r\n\r\n",'utf8'))
 client.send(bytes("Hello, World",'utf8'))

def main():
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 sock.bind(('localhost', 8080))
 sock.listen(5)

 while True:
  connection, address = sock.accept()
  handle_request(connection)
  connection.close()

if __name__ == '__main__':
 main()

Python 提供了两个级别访问的网络服务:

低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

什么是socket?

  Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

Socket()函数:

socket.socket([family[, type[, proto]]])

参数

family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0。

通信流程

#######server端##########

import socket

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

while True:
 conn, addr = sk.accept()
 while True:
  try:
   data = conn.recv(1024)
   print(str(data, 'utf8'))
   if not data:
    break
   inp = input(">>>")
   conn.send(bytes(inp, 'utf8'))
  except Exception:
   break

conn.close()

##########Client端###########
import socket

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
while True:
 inp = input(">>>")
 if inp == "exit":
  break
 sk.send(bytes(inp, 'utf8'))
 data = sk.recv(1024)
 print(str(data, 'utf8'))
sk.close()

Socket内建方法

s.bind()    绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen()  开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()  被动接受TCP客户端连接,(阻塞式)等待连接的到来<br>
客户端套接字
s.connect() 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常<br>
公共用途的套接字函数
s.recv()    接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send()    发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall() 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvform()    接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto()  发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()   关闭套接字
s.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)   设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])    返回套接字选项的值。
s.settimeout(timeout)   设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout()  返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()  返回套接字的文件描述符。
s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
s.makefile()    创建一个与该套接字相关连的文件

实例

#########Server端##########

import socket
import subprocess

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

while True:
 conn, addr = sk.accept()
 while True:
  try:
   data = conn.recv(1024)
  except Exception:
   break
  if not data:
   break

  # print(str(data, 'utf8'))
  # data = str(data, 'utf8')#解码同decode
  obj = subprocess.Popen(data.decode('utf8'), shell=True, stdout=subprocess.PIPE)
  ssh_result = obj.stdout.read()
  result_len = bytes(str(len(ssh_result)),'utf8')
  conn.send(result_len)

  conn.send(ssh_result)

conn.close()

#########Client#########

import socket

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)

while True:
 inp = input(">>>")
 if inp == "exit":
  break
 sk.send(bytes(inp, 'utf8'))
 result_len = int(str(sk.recv(1024), 'utf8'))
 print(result_len)
 data = bytes()
 while len(data) != result_len:
  recv = sk.recv(1024)
  data += recv
 print(str(data, 'gbk'))
sk.close()

文件上传

Server

import socket
import os

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
 conn, addr = sk.accept()
 while True:
  data = conn.recv(1024)
  cmd, file_name, file_size = str(data, 'utf8').split('|')
  path = os.path.join(BASE_DIR, 'model', file_name)
  file_size = int(file_size)

  f = open(path, 'ab')
  has_recv = 0
  while has_recv != file_size:
   data = conn.recv(1024)
   f.write(data)
   has_recv += len(data)
  f.close()

Client

import socket
import os

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
 inp = input(">>>>").strip()
 path = os.path.join(BASE_DIR, inp)

 file_name = os.path.basename(path)
 file_size = os.stat(path).st_size
 file_info = 'post|%s|%s' % (file_name, file_size)
 sk.sendall(bytes(file_info, 'utf8'))

 f = open(path, 'rb')
 has_sent = 0
 while has_sent != file_size:
  data = f.read(1024)
  sk.sendall(data)
  has_sent += len(data)

 f.close()
 print("上传成功")

socketserver

socketserver模块简化了网络编程服务程序的任务,同时SocketServer模块也是Python标准库中很多服务器框架的基础。

学习它的最好办法是自己浏览一遍它的源码。

首先先看一下如何去运用

import socketserver

class MyServer(socketserver.BaseRequestHandler):
 def handle(self):
  print("服务端启动")
  while True:
   conn = self.request

   while True:
    data = conn.recv(1024)
    print(str(data, 'utf8'))
    inp = input(">>>>>")

    conn.sendall(bytes(inp, 'utf8'))
   conn.close()

if __name__ == '__main__':
 server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer)
 server.serve_forever()

server
import socket

sk = socket.socket()

address = ('127.0.0.1', 8080)

sk.connect(address)
print("客户端启动")

while True:
 inp = input(">>>>>")
 sk.sendall(bytes(inp, 'utf8'))
 if inp == "q":
  break
 data = sk.recv(1024)
 print(str(data, 'utf8'))
sk.close()

此代码简单的实现了server端能同时和多个client聊天的功能。

我们在看源码前,首先要明确的是它分了几个类及每个类的功能作用等。

There are five classes in an inheritance diagram, four of which represent
synchronous servers of four types:

下面的就不一一详细说了,想要了解的更透彻,还是看一遍源码吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-09-27

python网络编程学习笔记(二):socket建立网络客户端

1.建立socket 建立socket对象需要搞清通信类型和协议家族.通信类型指明了用什么协议来传输数据.协议的例子包括IPv4.IPv6.IPX\SPX.AFP.对于internet通信,通信类型基本上都是AF_INET(和IPv4对应).协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM.因此对于TCP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)对于UDP通

python网络编程学习笔记(五):socket的一些补充

1.半开放socket 利用shutdown()函数使socket双向数据传输变为单向数据传输.shutdown()需要一个单独的参数,该参数表示了如何关闭socket.具体为:0表示禁止将来读:1 表示禁止将来写:2表示禁止将来读和写. 2.timeouts控制超时 调用socket的settimeout()函数,向其传递参数,表明超时时间设置.当访问一个socket,如果经过了参数设定的时间后,什么都没有发生,则会产生一个socket.timeout异常.例如:当程序运行后,会等待数据传入.

详解Python Socket网络编程

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python 进行TCP Socket 网络编程,假设你已经具

python socket网络编程步骤详解(socket套接字使用)

一.套接字套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要.套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳.许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持.三种最流行的套接

python网络编程学习笔记(三):socket网络服务器

1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对象 第二步 调用connect()建立一个和服务器的连接 设置socket选项(可选) 第三步 无 绑定到一个端口(也可以是一个指定的网卡) 第四步 无 侦听连接 下面具体来讲这四步的建立方法: 第一步,建立socket对象:这里与客户端一样,依然是: s=socket.socket(socket.

Python socket网络编程TCP/IP服务器与客户端通信

Python socket网络编程 初学 python,前段时间买了两本书<python 编程从入门到实践><Python 核心编程第三版>,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络编程,依然有好多不太理解的地方,不过想来通过自己不断的摸索,不断地搜寻资料学习,早晚应该会变得通透吧....... 这部分主要使用的模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象

python网络编程之TCP通信实例和socketserver框架使用例子

1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要经过四次握手,这是由TCP的半关闭造成的,一方在完成数据发送后要发送一个FIN来终止这个方向的连接,一个TCP连接在收到一个FIN后仍能发送数据,但应用程序很少这么做,下面是TCP连接建立和拆除的过程: 2.python可以实现TCP服务器和客户端的编程,下面是代码: 服务器端: 复制代码 代码如下: #!/usr/bin/env pythonimport

Python 网络编程起步(Socket发送消息)

一.服务端(Server.py)    服务端要做的事情是:    1. 创建一个Socket对象 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    2. 绑定一个端口 Code highlighting pro

从零开始学Python第八周:详解网络编程基础(socket)

一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.socket(sock

基于python图书馆管理系统设计实例详解

写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担了所有,肝了一周多,终于完成,但这个也算是一个很大的项目了吧,对于我现在来说,写这个项目遇到了很多困难,这是真的,其中涉及到数据库的使用,就遇到了一点瓶颈, 但这不算什么,还是要被我搞定的. 梦想就像这个远处夕阳,终究触手可及! Python项目: 项目前提: 这个项目涉及到的知识点有很多, 知识串

基于python时间处理方法(详解)

在处理数据和进行机器学习的时候,遇到了大量需要处理的时间序列.比如说:数据库读取的str和time的转化,还有time的差值计算.总结一下python的时间处理方面的内容. 一.字符串和时间序列的转化 time.strptime():字符串=>时间序列 time.strftime():时间序列=>字符串 import time start = "2017-01-01" end = "2017-8-12" startTime = time.strptime

MySQL数据库设计之利用Python操作Schema方法详解

弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

Python之str操作方法(详解)

1. str.format():使用"{}"占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). >>> string = 'python{}, django{}, tornado{}'.format(2.7, 'web', 'tornado') # 有多少个{}占位符就有多少个值与其对应,按照顺序"填"进字符串中 >>> string 'python2.7, djangoweb, tornadotornado'

Python探索之SocketServer详解

SocketServer,网络通信服务器,是Python标准库中的一个模块,其作用是创建网络服务器.SocketServer模块定义了一些类来处理诸如TCP.UDP.UNIX流和UNIX数据报之上的同步网络请求. SocketServer模块处理网络请求的功能,可以通过两个主要的类来实现:一个是服务器类,一个是请求处理类. 服务器类 处理通信问题,如监听一个套接字并接收连接等: 请求处理类 处理"协议"问题,如解释到来的数据.处理数据并把数据发回给客户端等. 这种实现将服务器的实现过程

python学习 流程控制语句详解

###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

Python 调用Java实例详解

Python 调用Java实例详解 前言: Python 对服务器端编程不如Java 所以这方面可能要调用Java代码 前提: Linux 环境  1 安装 jpype1 安装后测试代码: from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("Hello World") shutdownJVM() 2 调用非jdk的jar包, test.jar 包

python 编程之twisted详解及简单实例

python 编程之twisted详解 前言: 我不擅长写socket代码.一是用c写起来比较麻烦,二是自己平时也没有这方面的需求.等到自己真正想了解的时候,才发现自己在这方面确实有需要改进的地方.最近由于项目的原因需要写一些Python代码,才发现在python下面开发socket是一件多么爽的事情. 对于大多数socket来说,用户其实只要关注三个事件就可以了.这分别是创建.删除.和收发数据.python中的twisted库正好可以帮助我们完成这么一个目标,实用起来也不麻烦.下面的代码来自t

Python 文件操作的详解及实例

Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. 白首为功名,旧山松竹老,阻归程. 欲将心事付瑶琴. 知音少,弦断有谁听. f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件 注意:if in the win,hello文件是utf8保存的,打