Python套接字

1、客户端/服务器架构

  什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统。在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。另一方面,客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因。服务器无限地运行下去,并不断地处理请求;而客户端会对服务进行一次性请求,然后接收该服务,最后结束它们之间的事务。客户端在一段时间后可能会再次发出其他请求,但这些都被当作不同的事务。

2、客户端/服务器编程

2.1套接字

  套接字的起源可以追溯到20 世纪70 年代,它是加利福尼亚大学的伯克利版本UNIX(称为BSD UNIX)的一部分。因此,有时你可能会听过将套接字称为伯克利套接字或BSD 套接字。套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)。有两种类型的套接字:基于文件的和面向网络的。UNIX 套接字是我们所讲的套接字的第一个家族,并且拥有一个“家族名字”AF_UNIX(又名AF_LOCAL,在POSIX1.g 标准中指定),它代表地址家族(address family):UNIX。包括Python 在内的大多数受欢迎的平台都使用术语地址家族及其缩写AF;其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocol family),并使用其缩写PF 而非AF。类似地,AF_LOCAL(在2000~2001 年标准化)将代替AF_UNIX。然而,考虑到后向兼容性,很多系统都同时使用二者,只是对同一个常数使用不同的别名。Python 本身仍然在使用AF_UNIX。因为两个进程运行在同一台计算机上,所以这些套接字都是基于文件的,这意味着文件
系统支持它们的底层基础结构。这是能够说得通的,因为文件系统是一个运行在同一主机上的多个进程之间的共享常量

  第二种类型的套接字是基于网络的,它也有自己的家族名字AF_INET,或者地址家族:因特网。另一个地址家族AF_INET6 用于第6 版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前AF_INET 是使用得最广泛的。

  Python 2.5 中引入了对特殊类型的Linux 套接字的支持。套接字的AF_NETLINK 家族允许使用标准的BSD 套接字接口进行用户级别和内核级别代码之间的IPC。针对Linux 的另一种特性(Python 2.6 中新增)就是支持透明的进程间通信(TIPC)协议。TIPC 允许计算机集群之中的机器相互通信,而无须使用基于IP 的寻址方式。Python 对TIPC 的支持以AF_TIPC 家族的方式呈现。

2.2套接字地址:主机-端口对

  有效的端口号范围为0~65535(尽管小于1024 的端口号预留给了系统)。

2.3面向连接的套接字

  TCP 套接字,必须使用SOCK_STREAM 作为套接字类型。

2.4无连接的套接字

  实现这种连接类型的主要协议是用户数据报协议(更为人熟知的是其缩写UDP)。为了创建UDP 套接字,必须使用SOCK_DGRAM 作为套接字类型。

3、python中的网络编程

3.1socket 模块

socket模块属性

套接字创建:

socket(socket_family, socket_type, protocol=0)
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ud pSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

socket对象方法:

服务器创建:

ss = socket() # 创建服务器套接字
ss.bind() # 套接字与地址绑定
ss.listen() # 监听连接
inf_loop: # 服务器无限循环
cs = ss.accept() # 接受客户端连接
comm_loop: # 通信循环
cs.recv()/cs.send() # 对话(接收/发送)
cs.close() # 关闭客户端套接字
ss .close() # 关闭服务器套接字#(可选)

为服务器实现一个智能的退出方案时,建议调用close()方法。

客户端创建:

cs = socket() # 创建客户端套接字
cs.connect() # 尝试连接服务器
comm_loop: # 通信循环
cs.send()/cs.recv() # 对话(发送/接收)
cs .close() # 关闭客户端套接字

3.2 socketserver 模块

该模块中的类

创建SocketServer TCP 服务器

# 请求处理程序MyRequestHandler,作为SocketServer
# 中StreamRequestHandler 的一个子类,并重写了它的handle()方法,该方法在基类Request 中
# 默认情况下没有任何行为。
# def handle(self):
# pass
# 当接收到一个来自客户端的消息时,它就会调用handle()方法。而StreamRequestHandler
# 类将输入和输出套接字看作类似文件的对象,因此我们将使用readline()来获取客户端消息,
# 并利用write()将字符串发送回客户端。
from socketserver import TCPServer as TCP,StreamRequestHandler as SRH
from time import  ctime
HOST=‘‘
PORT=‘21567‘
ADDR=(HOST,PORT)

class MyRequestHandle(SRH):
    def handle(self):
        print(‘...connected from:{0}‘,self.client_address)
        self.wfile.write(‘[%s]%s‘%(ctime(),self.rfile.readline()))
tcpSever=TCP(ADDR,MyRequestHandle)
print(‘waiting for connection‘)
tcpSever.serve_forever()

创建TCP客户端

from socket import *
HOST=‘localhost‘
PORT=‘21567‘
BUFSIZ=1024
ADDR=(HOST,PORT)

while True:
    tcpClisocket=socket(ADDR,SOCK_STREAM)
    tcpClisocket.connect(ADDR)
    data=input(‘>‘)
    if not data:
        break
        # 因为这里使用的处理程序类对待套
        # 接字通信就像文件一样,所以必须发送行终止符(回车和换行符)
        # 而服务器只是保留并重用这里发送的终止符。当得到从服务器返回的消息时,用strip()
        # 函数对其进行处理并使用由print声明自动提供的换行符。
    tcpClisocket.send(‘%s\r\n‘%data)
    data=tcpClisocket.recv(BUFSIZ)
    if not data:
        break
    print(data.strip())
    tcpClisocket.close()

3.3 Twisted模块

Twisted 是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。它提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/ IM、DBM 及RDBMS 数据库集成、Web/因特网、电子邮件、命令行参数、GUI 集成工具包等。与SocketServer 类似,Twisted 的大部分功能都存在于它的类中。

Twisted Reactor TCP服务器

基于protocol 类创建TSServProtocol,重写connectionMade()和dataReceived()方法,当一个客户端连接到服务器时就会执行connectionMade()方法,而当服务器接收到客户端通过网络发送的一些数据时就会调用dataReceived()方法。
reactor 会作为该方法的一个参数在数据中传输,这样就能在无须自己提取它的情况下访问它。在服务器代码的最后部分中,创建了一个协议工厂。它之所以被称为工厂,是因为每次得到一个接入连接时,都能“制造”协议的一个实例。然后在reactor 中安装一个TCP 监听器,以此检查服务请求。当它接收到一个请求时,就会创建一个TSServProtocol 实例来处理那个客户端的事务。

from twisted.internet import protocol,reactor
from time import ctime
PORT=21567
class TSServProtocal(protocol.Protocol):
    def connectionMade(self):
        clnt=self.clnt=self.transport.getPeer().host
        print(‘...conected from:‘,clnt)
    def dataReceived(self, data):
        self.transport.write(‘[%s]%s‘%(ctime(),data))

factory=protocol.Factory()
factory.protocol=TSServProtocal
print(‘waiting for conneciton‘)
reactor.listenTCP(PORT,factory)
reactor.run()

Twisted Reactor TCP客户端

from twisted.internet import protocol, reactor
HOST=‘localhost‘
PORT=21567
class TSClntProtocal(protocol.Protocol):
    def sendData(self):
        data=input(‘>‘)
        if data:
            print(‘...sending%...‘%data)
        else:
            self.transport.loseConnection()
    def connectionMade(self):
        self.sendData()
    def dataReceived(self, data):
        print(data)
class TSClntFactory(protocol.Factory):
    protocol=TSClntProtocal
    clientConnectionLost=clientConnectionFailed=    lambda self,connector,reason:reactor.stop()
reactor.connectTCP(HOST,PORT,TSClntFactory())
reactor.run()
时间: 2024-10-13 01:12:42

Python套接字的相关文章

Python 套接字socketserver网络编程

为什么使用socketserver 虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的. Python考虑得很周到,为了满足我们对多线程网络服务器的需求,提供了"socketserver"模块.socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端.每个客户端请求连接到服务器时,socketserver服务端都会创建

Python 套接字的使用 (1)

获取设备名称和IPv4地址 socket.gethostname() socket.gethostbyname(host_name)   1 def print_machine_info(): 2 host_name = socket.gethostname(); 3 ip_address = socket.gethostbyname(host_name) 4 print ('host_name : ',host_name) 5 print (host_name,'\'IP : ',ip_add

2017.07.12 Python网络编程之使用多路复用套接字I/O

1.在本章开始之前,需要先理解同步与异步,阻塞与非阻塞的区别: "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话

2017.07.09 Python网络编程之重用套接字地址

1.重用套接字地址: # -*- coding: UTF-8 -*-# 如果在某个端口上运行一个Python套接字服务器,连接一次后便终止了运行,就不能在使用这个端口了# !usr/bin/env python# Python Network Programming Cookbook --Chapter -1# This program is optimized for Python 2.7# It may run on any other version with/without modifi

python使用原始套接字 解析原始ip头数据

使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100" socket_protocol = socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) sniffer.bind((host, 0)) sniffer.setso

Python学习-15.Python的中的套接字socket

Python应用最广泛的要数web方面了.因此,socket显得十分重要. 要使用socket,必须引入socket模块,因此在Python脚本开头先写入 1 import socket 学过socket的都知道,就是客户端和服务端的通信. 因此新建client.py和server.py文件. 先编写server.py文件: 1 import socket 2 3 # 创建 TCP 协议的套接字. 4 server = socket.socket(socket.AF_INET,socket.SO

Python网络编程(二)通过ThreadingMixIn实现多线程异步套接字程序

使用ThreadingMixIn类的特点: 在线程间共享应用的状态,与使用ForkingMixIn类相比避免进程间通信的复杂操作. 代码如下: 1 #! /usr/bin/python 2 3 import os 4 import socket 5 import threading 6 import SocketServer 7 8 SERVER_HOST = 'localhost' 9 SERVER_PORT = 0 10 BUF_SIZE = 1024 11 12 def client(ip

Python网络编程——修改套接字发送和接收的缓冲区大小

很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 1 # ! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import socket 5 6 # 设置发送缓冲域大小 7 SEND_BUF_SIZE = 4096 8 # 设置接收缓冲域大小 9 RECV_BUF_SIZE = 4096 10 11 12 def modify_buff_size(): 13 # 创建TCP soc

Python网络编程——处理套接字错误

在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应. Python的Socket库提供了一个方法,能通过socket.error异常优雅地处理套接字错误. 1. 代码及相关解释 1 # ! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # 处理套接字错误 4 5 import argparse 6 # python用于解析命令行参数和选项的标准模块 7 import sys 8 import socket