专栏首页CaiRuiPython 网络编程

Python 网络编程

1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。

2、客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件。

3、在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求。

一、套接字:通信端点

1、套接字

  套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。

  有两种类型的套接字:基于文件和面向网络的。

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

  如果一个套接字像一个电话插孔-允许通信的一些基础设施,那么主机名和端口号就像区号和电话号码的组合。有效的端口号范围为0-65535(小于1024的端口号预留给了系统)

3、面向连接的套接字和与无连接的套接字

  面向连接,在进行通信之前必须建立一个连接。实现这种连接类型主要协议是TCP(传输控制协议)

  无连接,在通信之前并不需要建立连接。主要协议是UDP(用户数据报协议)

二、Python中的网络编程

1、socket()模块函数

为创建TCP/IP套接字:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)

创建UDP/IP套接字:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.常见的套接字对象方法和属性

名称

描述

服务器套接字方法

s.bind()

将地址(主机名、端口号对)绑定到套接字上

s.listen()

设置并启动TCP监听器

s.accept()

被动接受TCP客户端连接,一直等待直到连接到达(阻塞)

客户端套接字方法

s.connect()

主动发起TCP服务器连接

s.connect_ex()

connect的扩展版本,此时会以错误代码的形式返回问题,而不是抛出一个异常

普通的套接字方法

s.recv()

接受TCP消息

s.send()

发送TCP消息

s.sendall()

完整的发送TCP消息

s.recvfrom()

接收UDP消息

s.shutdown()

关闭连接

s.close()

关闭套接字

3、创建TCP服务器

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

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print('waiting for connecting...')
    tcpClisock, addr = tcpSerSock.accept()
    print('...connected from:',addr)

    while True:
        data = tcpClisock.recv(BUFSIZ)
        if not data:
            break
        tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data))
    tcpClisock.close()
tcpSerSock.close()

4、创建TCP客户端

cs = socket()
cs.connect()
comm_loop:
    cs.send()/cs.recv()
cs.close()
#!/usr/bin/env python
#TCP时间戳客户端

from socket import *

HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

tcpClisock = socket(AF_INET,SOCK_STREAM)
tcpClisock.connect(ADDR)

while True:
    data = input('> ')
    if not data:
        break
    tcpClisock.send(data)
    data = tcpClisock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))
    
tcpClisock.close()

5、创建UDP服务器

ss = socket()
ss.bind()
inf_loop:
    cs = ss.recvfrom()/ss.sendto()
ss.close()
#!/usr/bin/env python
#UDP时间戳服务器

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)

while True:
    print('waiting for message...')
    data, addr=udpSerSock.recvfrom(BUFSIZ)
    udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)
    print('...received from and returned to:',addr)
    
udpSerSock.close()

6、创建UDP客户端

cs = socket()
comm_loop:
    cs.send()/cs.recvfrom()
cs.close()
#!/usr/bin/env python
#UDP时间戳客户端

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)

udpClisock = socket(AF_INET,SOCK_DGRAM)

while True:
    data = input('> ')
    if not data:
        break
    udpClisock.sendto(data,ADDR)
    data, ADDR=udpClisock.recvfrom(BUFSIZ)
    if not data:
        break
    print(data)
    
udpClisock.close()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python正则表达式

    正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。通过标准库中的re模块来支持正则表达式。 常见的正则表达式符号和特殊字符 ...

    用户1173509
  • nginx查看日志

    nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息 ...

    用户1173509
  • Python之函数练习题

    一、简述普通参数、指定参数、默认参数、动态参数的区别 普通参数:就是放入一个形参,当放入实参时,需要按照顺序给形参值。 指定参数:放入实参时是指定的,不用按照顺...

    用户1173509
  • 云蚁汽车小程序解决方案

    车主选择汽车洗美、维修保养等服务一般都是就近原则,不愿耗费精力选择远距离的服务,覆盖范围广的汽车服务导流平台提供的促销信息对车主来说大多数都是不具备吸引力的。

    云蚁cloudant
  • 快速学习-以太坊交易的 value 和 data

    cwl_java
  • 多云模式神话破灭,可携带性工作负载是天方夜谭?

    多云的定义 在过去的一两年内,多云的概念现在了IT行业中,其大致是指一种公司不仅使用一个到数个SaaS服务(如人力资源或邮件服务等)并同时使用PaaS服务进行软...

    BestSDK
  • 1 小程序开发 - 获取用户登录信息

    用户5927264
  • Android完美适配dimens.xml脚本

    相信大家都有适配的经历,而且面对大千世界千奇百怪的安卓手机,适配起来那叫一个蛋疼。所以本人决定研究一下自动化适配的方法,于是乎从dimens文件入手。 什么...

    先知先觉
  • 微服务到底有多微?How big is a microservice?

    关于这个问题,有人说用代码行数来衡量微服务到底有多微,我们都知道不同语言写的微服务行数肯定都不统一,这个显然行不通;还有人说用重写时间来衡量,什么意思呢?就是说...

    ImportSource
  • The Log(我读过的把日志讲的最透彻的一篇)

    作者博客 | https://www.cnblogs.com/foreach-break

    曲水流觞

扫码关注云+社区

领取腾讯云代金券