Python-Socket编程(读书笔记)

前言:打好基础,加油!!!,给大家安利,《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()

猜你喜欢

转载自blog.csdn.net/solitudi/article/details/106973673