系列文章目录




python基础①-基础环境搭建和工具使用python基础②-常用的各种数据类型初认知python基础③-数据类型常用的操作和方法字符串、数值、boolpython基础④-数据类型常用的操作和方法列表、元组、字典、集合python基础⑤-控制流程python基础⑥-函数python基础⑦-字符编码与文件操作python基础⑧-异常python基础⑨-迭代器和生成器python基础⑩-面向对象python基础⑪-继承与派生python基础⑫-多进程python基础⑬-多线程python基础⑭-进程池、线程池、协程python基础⑮-网络编程socketpython基础⑯-网络编程socket进阶




文章目录

  • 系列文章目录
  • 网络基础
  • OSI七层协议(学网络编程最重要的底子)
  • socket套接字
  • 基于tcp协议的socket通讯
  • 服务端
  • 客户端
  • 思考:


网络基础

  1. C/S架构
    C/S: Client客户端--------基于网络----------Server服务端
    你 --------------- 电商 ---------- 商家
    有一个地址不固定 有一个地址固定
    多个 只有一个(稳定)
  2. 服务端需要遵循的原则:
    2.1 服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定
    2.2 对外一直提供服务,稳定运行(代码保证,操作系统稳定,计算机也稳定)
    因为服务端代码运行在操作系统之上,操作系统运行在硬件之上(这就是运维的工作)
    2.3 服务端应该支持并发(客服端同时就收服务)
  3. 什么是网络
    客户端计算机和服务端计算机通信
    网络建立的目的是为数据交互(通信)
    如何实现通信:
    1. 建立好底层的物理连接介质
    2. 有一套统一的通信标准,称之为互联网协议

OSI七层协议(学网络编程最重要的底子)

可以参考这篇文章非常详细

socket套接字

socket是什么
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket其实就是一个门面模式,
它把复杂的TCP/IP协议族隐藏在Socket接口后面,
对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

基于tcp协议的socket通讯

服务端

import socket

# AF_INET 互联网协议
# SOCK_STREAM TCP流式协议,
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(serverSocket)
# 绑定ip和端口
serverSocket.bind(('127.0.0.1', 8080))

#
# 监听端口。指定限制
serverSocket.listen(5)

print('start')
# io 操作 沿着网络传输数据 读写文件
# 建立三次握手
conn, client_addr = serverSocket.accept()
print(conn)
print(client_addr)
#  收/发消息
# 1024接收的最大字节数bytes
data = conn.recv(1024)
print('收到客户端的数据', data)
# 变大写发送回去
conn.send(data.upper())

# 关闭与客户端建立的连接
conn.close()

# 关闭服务器
serverSocket.close()

客户端

import socket

# AF_INET 互联网协议
# SOCK_STREAM TCP流式协议,
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(socket)
# 与服务端建立连接,服务端的 ip和端口
socket.connect(('127.0.0.1', 8080))

# 发/收消息
socket.send('hello'.encode('utf-8'))

# 收
data = socket.recv(1024)
print('收到服务端的数据', data)

# 关闭与服务端的链接
socket.close()

先启动服务端,服务端会阻塞,等待客户端的连接请求
然后启动客户端。实现发送和接受消息

python3 网络编程 python网络编程基础_服务端


python3 网络编程 python网络编程基础_udp_02

思考:

以上的客户端与服务端交互还是有很多问题:

  1. 虽然服务端能接受5个链接,但是为啥接收了一个就关闭了?
  2. 如果发送的数据超过1024byte岂不是没法接受?
  3. 貌似服务端是单线程的串行执行。岂不是没法同时服务多个客户端?

后面的文章会一一解决这样的问题。