Python3 网络编程(转载)

技术交流QQ群:1027579432,欢迎你的加入!

1.Socket编程介绍

  • socket是基于C/S架构的,也就是说进行socket网络编程时,通常需要两个文件,一个是服务端,一个客户端
  • 首先导入socket模块:import socket
  • python中socket通信逻辑如下图所示:


    socket网络编程.png
  • python中,使用socket.socket()方法来创建套接字,sk = socket.socket([family[, type[, proto]]])
    • family: 套接字家族,可以使AF_UNIX或者AF_INET。
    • type: 套接字类型,根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM,也就是TCP和UDP的区别
    • protocol: 一般不填默认为0


      socket具体参数.png

      服务端和客户端方法.png

      公共方法.png
  • 注意:
    • a.Python3以后,socket传递的都是bytes类型的数据,字符串需要先转换一下,string.encode()即可;另一端接收到的bytes数据想转换成字符串,只要bytes.decode()一下就可以。
    • b.在正常通信时,accept()和recv()方法都是阻塞的。所谓的阻塞,指的是程序会暂停在那,一直等到有数据过来。

2.Socket编程思路

  • 服务端:
    • a.创建套接字,绑定套接字到本地IP与端口:socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()
    • b.开始监听连接:s.listen()
    • c.进入循环,不断接受客户端的连接请求:s.accept()
    • d.接收传来的数据,或者发送数据给对方:s.recv() , s.sendall()
    • e.传输完毕后,关闭套接字:s.close()
  • 客户端:
    • a.创建套接字,连接服务器地址:socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()
    • b.连接后发送数据和接收数据:s.sendall(), s.recv()
    • c.传输完毕后,关闭套接字:s.close()
  • 注意:Python的socket编程,通常可分为TCP和UDP编程两种,前者是带连接的可靠传输服务,每次通信都要握手,结束传输也要挥手,数据会被检验,是使用最广的通用模式;后者是不带连接的传输服务,简单粗暴,不加控制和检查的一股脑将数据发送出去的方式,但是传输速度快,通常用于安全和可靠等级不高的业务场景,比如文件下载

3.TCP编程

  • 服务端程序,服务端先运行,程序如下:
import socket

# TCP编程
ip_port = ('127.0.0.1', 9999)
sk = socket.socket()  # 创建socket对象
sk.bind(ip_port)  # 为对象绑定ip地址和端口
sk.listen(5)  # 监听设置的端口,等待客户端的请求
print("启动socket服务,等待客户端连接...")
conn, address = sk.accept()  # 等待连接,此处自动阻塞
while True:
    client_data = conn.recv(1024).decode()  # 接收的数据是bytes数据,转成string类型
    if client_data == 'exit':  # 判断是否退出连接
        exit("通信结束")
    print("来自%s的客户端向发来信息:%s" % (address, client_data))
    conn.sendall("服务端已经收到你的信息".encode())  # 对客户端给出确认
conn.close()  # 关闭连接
  • 客户端程序,客户端程序后运行,程序如下:
import socket 

# TCP编程


ip_port = ('127.0.0.1', 9999)

s = socket.socket()  # 创建socket对象

s.connect(ip_port)  # 连接服务端

while True:   # 通过一个死循环不断接收用户输入,并发送给服务器
    inp = input("请输入你想要发送的一个信息: ").strip()
    if not inp:   # 防止输入空的信息,导致异常退出
        continue
    s.sendall(inp.encode())  # socket传递的都是bytes类型的数据,字符串先encode转成bytes类型
    
    if inp == "exit":
        print("通信结束!")
        break
    server_reply = s.recv(1024).decode()  # decode()是将bytes类型转成string类型
    print(server_reply)
s.close()   # 关闭连接

4.上面TCP编程例子的不足

  • 当服务端和客户端是一对一进行通信的情况下,工作是良好的。但是,如果有多个客户端同时连接同一个服务器时,结果可能不行。因为服务端无法同时对多个客户端提供服务。因为Python的socket模块,默认情况下创建的是单进程单线程,同时只能处理一个连接请求,如果实现多用户服务,那么需要使用多线程机制
  • 下面使用Python内置的threading模块,配合socket模块创建多线程服务端。客户端的代码不需要更改,可以继续使用。服务端的代码如下:
import threading
import socket


def link_handler(link, client):
    """
    此函数是线程需要执行的函数,负责具体的服务器和客户端之间的通信工作
    link: 当前线程处理的连接
    client: 客户端ip和端口信息
    """
    print("服务端开始接收来自[%s:%s]的请求..." % (client[0], client[1]))
    
    while True:
        client_data = link.recv(1024).decode()
        if client_data == "exit":
            print("结束与[%s:%s]的通信..." % (client[0], client[1]))
            break
        print("来自[%s:%s]的客户端向你发来信息:%s" % (client[0], client[1], client_data))
        link.sendall('服务器已经收到你的信息'.encode())
    link.close()
    

ip_port = ("127.0.0.1", 9999)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

print("启动socket服务,等待客户端连接...")
while True:              # 一个死循环,不断的接收的连接请求
    conn, address = sk.accept()  # 等待连接,此处自动阻塞
    # 每当有新的连接过来,自动创建一个新的线程,
    # 并将连接对象和访问者的ip信息作为参数传递给线程的执行函数
    t = threading.Thread(target=link_handler, args=(conn, address))
    t.start()

5.UDP编程

  • 相对于TCP编程,UDP编程就简单很多。但是可靠性与安全性也差很多。由于UDP没有握手和挥手的过程,因此accept()和connect()都不需要,如下面的例子:
#######服务端#########
import socket

ip_port = ('127.0.0.1', 9999)

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sk.bind(ip_port)

while True:
    data = sk.recv(1024).strip().decode()
    print(data)
    
    if data == "exit":
        print("客户端主动断开连接!")
        break
sk.close()
#######客户端#########
import socket

ip_port = ("127.0.0.1", 9999)

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
while True:
    inp = input("发送的消息: ").strip()
    sk.sendto(inp.encode(), ip_port)
    
    if inp == "exit":
        break
sk.close()

6.博客原文

原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 1,999评论 0 6
  • 第一章 TCP/IP简介 基本的C/S服务模型 网络编程是指编写的网络通信程序可以与网络上的其他程序进行通信。 T...
    Waldo_cuit阅读 1,912评论 0 6
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,215评论 0 10
  • 第一章 引言和网络编程基础知识 1.1 分别简述OSI参考模型和TCP/IP模型,并阐述他们之间的对应关系 1.2...
    V0W阅读 5,312评论 0 9
  • 1. 网络概述 1.1 概述 1.1.1什么是网络? 早期的计算机都是互相独立的一套一台以数据运算为主的机器。...
    _宁采臣阅读 717评论 0 1