python 的与众不同 -- 网络篇(一、Socket套接字)

Socket套接字

  • Socket是一种通用的网络编程接口,和网络层次没有一一对应的关系

  • Python中提供了socket.py标准库,非常底层的接口库

  • 在开发工程中很少用到Socket
    因为太底层了,写底层要学习很多硬件方面的知识。想写底层去学c多好,我们使用python就是为了简单、方便、快捷

  • Socket可以应用在任何操作系统,就是一个网络协议,和操作系统没有关系

  • 支持TCP(面向链接)和UDP(无链接)协议,默认为TCP

  • Socket分为服务端和客户端两部分

    • 服务端创建步骤

      • 引入socket包
      • 创建socket对象
      • 绑定ip/端口
      • 监听ip/端口
      • 允许链接
      • 读取/写入(和客户端交互)
      • 关闭链接
    • 客户端创建步骤(TCP)

      • 引入socket包
      • 创建socket对象
      • 链接服务器
      • 读取/写入(和服务端交互)
      • 关闭链接
  • 代码实现

    • 服务端
    # 引入socket包
    import socket
    #创建socket对象
    service = socket.socket()
    
    ipaddr = ('127.0.0.1',9999)
    # 绑定ip/端口
    service.bind(ipaddr)
    # 监听ip/端口
    service.listen()
    # 允许链接  并返回新(仔)的socket和客户端的地址信息
    s1,raddr1 = service.accept()
    
    # 接收数据(缓冲区)
    client_content = s1.recv(1024)
    
    # 发送数据
    s1.send(b"service send...")
    # 关闭链接
    s1.close()
    service.close()
    
    • 客户端
    # 引入socket包
    import socket
    # 创建socket对象
    client = socket.socket()
    
    ipaddr = ('127.0.0.1',9999)
    # 链接服务器
    client.connect(ipaddr)
    
    # 发送数据
    client.send(b"hello service,I am the client")
    # 接收数据(缓冲区)
    service_content = client.recv(1024)
    print(service_content)
    # 关闭链接
    client.close()
    
  • 可以不停交互的Demo
    服务端

# 引入socket包
import socket
#创建socket对象
service = socket.socket()

ipaddr = ('127.0.0.1',9999)
# 绑定ip/端口
service.bind(ipaddr)
# 监听ip/端口
service.listen()
# 允许链接  并返回新(仔)的socket和客户端的地址信息
s1,raddr1 = service.accept()

while True:
    # 接收数据
    client_content = s1.recv(1024)
    print(str(client_content, encoding = "utf-8"))

    in_data = input('我说:')
    # 发送数据
    s1.send(bytes('服务器说:' + in_data, encoding = "utf8"))

s1.close()
service.close()

客户端

import socket

client = socket.socket()

ipaddr = ('127.0.0.1',9999)

client.connect(ipaddr)
# str to bytes
while True:
    in_data = input('我说:')
    # 发送
    client.send(bytes('客户器说:' + in_data, encoding = "utf8"))
    # 接收
    service_content = client.recv(1024)
    print(str(service_content, encoding = "utf-8"))

client.close()

以上代码并不严谨,制作测试使用

web服务器

web服务器有很多框架

  • WSGI:Web Server Gateway Interface。
  • Flask :比较流行的Web框架,比WSGI接口简单
  • Django:全能型Web框架;
  • web.py:一个小巧的Web框架;
  • Bottle:和Flask类似的Web框架;
  • Tornado:Facebook的开源异步Web框架。

一个简单的Demo

使用WSGI完成一个简单的demo
WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,只是一种规范,描述web server如何与web application通信的规范。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Torando,Flask,Django

  • web application 端
# hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']
  • web server 端
# server.py

# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

application端中
environ:是一个包含所有HTTP请求信息的dict对象;
start_response:一个发送HTTP响应的函数。
运行server.py浏览器访问http://localhost:8000,返回Hello, web!
我们给一个参数http://localhost:8021/?para=123并打印environ可以看到入参

{'ALLUSERSPROFILE': 'C:\\ProgramData', 'PROCESSOR_ARCHITEW6432': 'AMD64', 'PSMODULEPATH': 'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'COMMONPROGRAMFILES': 'C:\\Program Files (x86)\\Common Files', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'FLUTTER_STORAGE_BASE_URL': 'https://storage.flutter-io.cn', 'USERNAME': 'Administrator', 'NUMBER_OF_PROCESSORS': '4', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'WINDOWS_TRACING_FLAGS': '3', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_ARCHITECTURE': 'x86', '_DFX_INSTALL_UNSIGNED_DRIVER': '1', 'HOMEPATH': '\\Users\\Administrator', 'MIC_LD_LIBRARY_PATH': 'C:\\Program Files (x86)\\Common Files\\Intel\\Shared Libraries\\compiler\\lib\\mic', 'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local', 'USERPROFILE': 'C:\\Users\\Administrator', 'FP_NO_HOST_CHECK': 'NO', 'USERDOMAIN': 'USER-20191129RJ', 'SYSTEMROOT': 'C:\\WINDOWS', 'SYSTEMDRIVE': 'C:', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PUB_HOSTED_URL': 'https://pub.flutter-io.cn', 'OS': 'Windows_NT', 'LOGONSERVER': '\\\\USER-20191129RJ', 'PROGRAMDATA': 'C:\\ProgramData', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'ONEDRIVE': 'C:\\Users\\Administrator\\OneDrive', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'PROGRAMFILES': 'C:\\Program Files (x86)', 'HOMEDRIVE': 'C:', 'WINDIR': 'C:\\WINDOWS', 'INTEL_DEV_REDIST': 'C:\\Program Files (x86)\\Common Files\\Intel\\Shared Libraries\\', 'USERDOMAIN_ROAMINGPROFILE': 'USER-20191129RJ', 'PROGRAMW6432': 'C:\\Program Files', 'PYTHONIOENCODING': 'utf-8', 'APR_ICONV_PATH': 'D:\\Subversion\\iconv', 'SUBLIMEREPL_AC_PORT': 'None', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel', 'SUBLIMEREPL_AC_IP': '127.0.0.1', 'PROCESSOR_REVISION': '3c03', 'PATH': 'C:\\Program Files (x86)\\Common Files\\Intel\\Shared Libraries\\redist\\intel64\\compiler;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;D:\\xampps\\perl\\bin\\;D:\\flutter\\bin;C:\\Program Files\\Git\\cmd;D:\\Subversion\\bin;D:\\xampps\\mysql\\bin;C:\\Program Files (x86)\\QuickTime\\QTSystem\\;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32\\Scripts\\;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32\\;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files (x86)\\SSH Communications Security\\SSH Secure Shell;D:\\VS Code\\bin;E:\\AndroidSdk\\platform-tools;;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Fiddler', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'PUBLIC': 'C:\\Users\\Public', 'SESSIONNAME': 'Console', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'COMPUTERNAME': 'USER-20191129RJ', 'SERVER_NAME': 'USER-20191129RJ', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8021', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'QUERY_STRING': '==para=123==', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': 'localhost:8021', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 'HTTP_SEC_FETCH_USER': '?1', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'HTTP_SEC_FETCH_SITE': 'none', 'HTTP_SEC_FETCH_MODE': 'navigate', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'wsgi.input': <_io.BufferedReader name=784>, 'wsgi.errors': <_io.TextIOWrapper name='' mode='w' encoding='utf-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': False, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': }

各种框架有很多,想了解的请自行搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马志武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值