前言:打好基础,加油!!!,给大家安利,《Python核心编程》这本书真的不错,小白不要看,适合有一定基础后再看!!!强推!!!我这个是个简单的读书笔记,目的只是为了让自己养成一种记录的习惯,毕竟咋也只是刚刚开始,没那么多自己能写的东西,希望通过这种方式督促自己的学习;
文章目录
socket
基本用法
要创建套接字,必须使用socket.socket()
用法:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
,代表TCP与IP,其他参数自行百度,
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
,代表UDP/IP
所有套接字都是通过使用 socket.socket()函数来创建的,并且它们必须绑定到一个本地地址,调用 accept()函数之后,就开启了一个简单的(单线程)服务器,它会等待客户端的连接。默认情况下,accept()是阻塞的,这意味着执行将被暂停,直到一个连接到达。
关于listen(n)
listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。n也可以看作是"排队的数量"
一般情况下,一个进程只有一个主线程(也就是单线程),那么socket允许的最大连接数为: n + 1
如果服务器是多线程,比如上面开了2个线程,那么socket允许的最大连接数就是: n + 2
换句话说:排队的人数(就是那个n) + 正在就餐的人数(服务器正在处理的socket连接数) = 允许接待的总人数(socket允许的最大连接数)
内置方法
一个简单的例子
服务端:
import socket
from time import ctime
HOST = "0.0.0.0"
PORT = 8000
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen()
while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()
print("...connected from:", addr)
data = tcpCliSock.recv(BUFSIZ).decode("utf-8")
if not data:
break
print(data)
tcpCliSock.send(f'[{ctime()}] {data}'.encode("utf-8"))
tcpCliSock.close()
客户端:
import socket
HOST = "127.0.0.1"
PORT = 8000
BUFSIZ = 1024
ADDR = (HOST, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
client.send("Y4tacker".encode("utf-8"))
data = client.recv(BUFSIZ).decode("utf-8")
print(data)
解释:
HOST 变量是空白的,这是对 bind()方法的标识,表示它可以使用任何可用的地址,当然也可以写成0.0.0.0
SocketServer 模块
SocketServer 是标准库中的一个高级模块(Python 3.x 中重命名为socketserver),它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必需的代码。这个模块中有为你创建的各种各样的类
SocketServer 模块类
创建 SocketServer TCP 服务端
Add:坑死了,在python3里面是小写!!!坑死了,记得encode!!!
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime
HOST = ''
PORT = 8000
ADDR = (HOST, PORT)
# 当接收到一个来自客户端的消息时,它就会调用 handle()方法。而 StreamRequestHandler
# 类将输入和输出套接字看作类似文件的对象,因此我们将使用 readline()来获取客户端消息,
# 并利用 write()将字符串发送回客户端
class MyRequestHandler(SRH):
def handle(self):
print('connected from:', self.client_address)
self.wfile.write(f'[{ctime()}] {self.rfile.readline().decode("utf-8")}'.encode("utf-8"))
tcpServ = TCP(ADDR, MyRequestHandler)
print('waiting for connection...')
tcpServ.serve_forever()
创建 SocketServer TCP 客户端
坑死了,记得每个send的消息体最后加上\r\n
不然就接收不到消息
import socket
HOST = "127.0.0.1"
PORT = 8000
BUFSIZ = 1024
ADDR = (HOST, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
client.send("Y4tacker\r\n".encode("utf-8"))
data = client.recv(BUFSIZ).decode("utf-8")
print(data)
Twisted 框架介绍
Twisted 是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。它提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/ IM、DBM 及 RDBMS 数据库集成、Web/因特网、电子邮件、命令行参数、GUI 集成工具包等。
服务端:
from twisted.internet import protocol, reactor
from time import ctime
PORT = 8000
class TSServProtocol(protocol.Protocol):
def connectionMade(self):
clnt = self.clnt = self.transport.getPeer().host
print('...connected from:', clnt)
def dataReceived(self, data):
self.transport.write(f'[{ctime()}] [{data.decode("utf-8")}]'.encode("utf-8"))
factory = protocol.Factory()
factory.protocol = TSServProtocol
print('waiting for connection...')
reactor.listenTCP(PORT, factory)
reactor.run()
客户端:
from twisted.internet import protocol, reactor
HOST = '127.0.0.1'
PORT = 8000
class TSClntProtocol(protocol.Protocol):
def sendData(self):
data = 'ywh'
print(f'...sending {data}...')
self.transport.write(data.encode("utf-8"))
def connectionMade(self):
self.sendData()
def dataReceived(self, data):
print(data)
self.sendData()
class TSCLntFactory(protocol.ClientFactory):
protocol = TSClntProtocol
clientConnectionLost = clientConnectionFailed = lambda self, connector, reason: reactor.stop()
reactor.connectTCP(HOST, PORT, TSCLntFactory())
reactor.run()