Python高阶技巧 网络编程

Socket

ocket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要socket。

Socket负责进程之间的网络数据传输,好比数据的搬运工。

 客户端和服务端

2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息

Socket客户端:主动连接服务端、可以发送消息、可以接收回复

Socket服务端编程

主要分为如下几个步骤:

1. 创建socket对象

import socket
# 创建Socket对象
socket_server = socket.socket()

2. 绑定socket_server到指定IP和地址

# 绑定socket_server到指定的ip和地址
socket_server.bind(host, port)

3.  服务端开始监听端口

# 服务端监听端口
socket_server.listen(backlog)
# listen方法内接受一个整数传参数,
# backlog为int整数,表示接受的链接数量,超出的会等待,可以不填,不填会自动设置一个合理值

4.  接收客户端连接,获得连接对象

# 接受客户端连接,获得连接对象
# result: tuple = socket_server.accept()
# conn = result[0]        # 客户端和服务端的链接对象
# address = result[1]     # 客户端的地址信息

conn, address = socket_server.accept()
print(f"接收到了客户端的链接,客户端的信息是:{address}")

# accept()方法,是阻塞的方法,等待客户端的链接,如果没有链接,就卡在这一行不向下执行了
# accept方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept()的形式,直接接受二元元组内的两个元素

5. 客户端连接后,通过recv方法,接收客户端发送的消息

while True:
    # 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象
    data: str = conn.recv(1024).decode("UTF-8")
    # recv接受的参数是缓冲区大小,一般给1024即可
    # recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的消息是:{data}")

6. 通过conn(客户端当次连接对象),调用send方法可以回复消息

while True:
    # 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象
    data: str = conn.recv(1024).decode("UTF-8")
    # recv接受的参数是缓冲区大小,一般给1024即可
    # recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的消息是:{data}")
    # 发送回复消息
    msg = input("请输入你要和客户端回复的消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))

7. conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接

# 关闭链接
conn.close()
socket_server.close()

实现服务端并结合客户端进行测试

下载网络调试助手作为客户端

https://github.com/nicedayzhu/netAssist/releases

Socket客户端编程

主要分为如下几个步骤:

1. 创建socket对象

2. 连接到服务端

3. 发送消息

4. 接收返回消息

 

5. 关闭链接

服务端客户端相互通讯

结合上一节学习的服务端代码,以及当前学习的客户端代码。

两者均运行起来,进行相互通讯。

 

"""
演示Socket服务端开发
"""
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
# listen方法内接受一个整数传参数,表示接受的链接数量
# 等待客户端链接
# result: tuple = socket_server.accept()
# conn = result[0]        # 客户端和服务端的链接对象
# address = result[1]     # 客户端的地址信息
conn, address = socket_server.accept()
# accept方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept()的形式,直接接受二元元组内的两个元素
# accept()方法,是阻塞的方法,等待客户端的链接,如果没有链接,就卡在这一行不向下执行了

print(f"接收到了客户端的链接,客户端的信息是:{address}")

while True:
    # 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象
    data: str = conn.recv(1024).decode("UTF-8")
    # recv接受的参数是缓冲区大小,一般给1024即可
    # recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
    print(f"客户端发来的消息是:{data}")
    # 发送回复消息
    msg = input("请输入你要和客户端回复的消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))
# 关闭链接
conn.close()
socket_server.close()
"""
演示Socket客户端开发
"""
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(("localhost", 8888))

while True:
    # 发送消息
    msg = input("请输入要给服务端发送的消息:")
    if msg == 'exit':
        break
    socket_client.send(msg.encode("UTF-8"))
    # 接收返回消息
    recv_data = socket_client.recv(1024)        # 1024是缓冲区的大小,一般1024即可。 同样recv方法是阻塞的
    print(f"服务端回复的消息是:{recv_data.decode('UTF-8')}")
# 关闭链接
socket_client.close()

总结:

客户端和服务端的相同点:

import socket
# 创建socket对象
socket_client = socket.socket()

客户端和服务端的不同点:

  • 服务端:
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
  • 服务端先接收消息再发送消息
  • 客服端:
# 连接到服务端
socket_client.connect(("localhost", 8888))
  • 客服端先发送消息再接收消息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作 者: (美)丘恩(Chun,W.J.) 著,宋吉广 译   出 版 社: 人民邮电出版社   出版时间: 2008-7-1   字 数: 1317000   页 数: 654   开 本: 16开   I S B N : 9787115178503   分类: 图书 >> 计算机/网络 >> 程序设计   定价:¥89.00 [编辑本段]编辑推荐   初学Python?这是一本有关Pyttlon开发的权威指南   涵盖近期发布的Pyttlon版本的核心功能特性,而不仅仅是语法   学习更多的高阶内容,如正则表达式、网络、多线程、图形用户界面、Web/CGl和Python扩展等   包括几个全新的章节,关于数据库、网络客户端、Java/Jytt30n和Microsoft Office等   展示数以百计的代码片段、交互实例和大量加强您的Pyttlon技能的实用练习   学习专业的Python风格、最佳实践和好的编程习惯;   加强对Pyttlon对象、内存模型和Pythom面向对象特性的深入理解;   构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件;   学习如何使用Python中的Tkinler和其他工具来开发自己的GUI应用程序及软件:   通过用C等语言编写扩展来提升Pytllon应用程序的性能,或者通过使用多线程增强I/O相关的应用程序的能力;   学习Pyttlon中有关数据库的API,以及如何在Pyttlon中使用各种不同的数据库系统,包括MySQL、Postgres和SQLite。   本书提供:   对Python核心特性系统的专家级讲解;   开发复杂的应用程序和软件所需的强大深入的视角:   易用的图表,详细描述了Pyffion模块、操作符、函数和方法:   大量的专业级实例代码,从小的代码片段到功能齐全的应用程序一应俱全。 [编辑本段]内容简介   本书是经典的Python指导书,在第一版的基础上进行了全面升级。全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程、模块、面向对象编程、执行环境等内容:第2部分则提供了各种高级主题来展示可以使用Python做些什么,包括正则表达式、网络编程网络客户端编程、多线程编程、图形用户界面编程、Web编程、数据库编程、扩展Python 和一些其他材料。 本书适合Python初学者,以及已经入门但想继续学习和提高自身Python技巧的程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@明天更美好

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

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

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

打赏作者

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

抵扣说明:

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

余额充值