专栏首页python3网络通信 & 初识socket

网络通信 & 初识socket

本节主要内容:

1.客户短\服务端架构

2.网络通信的流程

3.初识socket

一.客户端\服务端架构

客户端\服务端架构:

Client/Server (C/S) 结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。

客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。

B\S架构:

Browser/Server (浏览器/服务器) 结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现。

客户端基本上没有专门的应用程序,应用程序基本上都在服务器端。由于客户端没有程序,应用程序的升级和维护都可以在服务器端完成,升级维护方便。由于客户端使用

浏览器,使得用户界面“丰富多彩”,但数据的打印输出等功能受到了限制。为了克服这个缺点,一般把利用浏览器方式实现困难的功能,单独开发成可以发布的控件,在客户端利用程序调用来完成.

软件C\S架构:客户端\服务端架构:京东,淘宝,今日头条,qq,微信.....

B\S架构:浏览器(browser)\服务端>>>统一接口,例: 微信上的小程序

硬件C\S架构: 打印机.

 二.网络通信的流程

网络通信中的一些基本概念: 

网线:传送电信号

网卡: 提供网络接口,接收电信号

MAC地址: 长度为48位二进制, 通常由12位16进制数表示(前六位是厂商编号, 后六位是流水线号), 每块网卡出厂时都被烧制了全球唯一的mac地址.

Ethernet规定接入Internet的设备都必须具备网卡, 发送端和接收端的地址便是网卡的地址.

查看mac地址的方法:windows下在cmd窗口输入ipconfig -all指令:下面显示的这个物理地址就是mac地址。

集线器:将所有连接到集线器的网络设备连通起来

交换机: 升级版的集线器

路由器:用来转发消息

路由协议:用来计算转发消息的最优路径

IP地址: 互联网协议地址, 它是IP协议提供的一种统一的地址格式, 它为互联网上的每一个网格和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异.在IPv4里有32位二进制数组成, 通常被分割为4个8位二进制数, 由四个点分十进制数表示.

DHCP服务: 是一个局域网的网络协议, 使用UDP协议工作, 用于内部网络自动分配IP地址

子网掩码: 格式与IP地址一样, 将某个IP地址划分成网络地址和主机地址两部分, 用来判断两个IP地址是否在一个网段.1表示网络地址, 0表示主机地址.

网关: 一个网络通向其他网络的IP地址, 即路由器的IP地址

DNS: 进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器

广播: 将源MAC地址,目标MAC地址及信息通过交换机和路由器发送给局域网内的所有其他设备

ARP协议: 地址解析协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址.

网络通信的流程:

关于网络通信的整个流程请点击链接查看.

三.初识socket

socket是实现网络编程的工具, 以下是两段简单的代码.

import socket
#创建一个socket对象
server = socket.socket()  #相当于创建了一部电话
ip_port = ('192.168.111.1',8001) #创建一个电话卡
server.bind(ip_port) #插上电话卡
server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,
但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错
print('11111')
#等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn,addr = server.accept()  #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('22222')
print(conn)
print('>>>>>>>>>',addr)
while True:
    from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息
    from_client_data = from_client_data.decode('utf-8')
    print(from_client_data)
    if from_client_data == 'bye':
        break
    server_input = input('明威说>>>>:')
    conn.send(server_input.encode('utf-8'))
    if server_input == 'bye':
        break
conn.close() #挂电话
server.close() #关手机
import socket
import time

client = socket.socket()
server_ip_port = ('192.168.111.1',8001)

client.connect(server_ip_port)

while True:
    client_input = input('小文说>>>>:')
    client.send(client_input.encode('utf-8')) #给服务端发送消息
    if client_input == 'bye':
        break
    from_server_data = client.recv(1024)

    print('来自服务端的消息:',from_server_data.decode('utf-8'))
    if from_server_data.decode('utf-8') == 'bye':
        break
client.close() #客户端挂电话

 注意: 先运行server,然后再运行client,然后你会发现client这个文件再输出台的地方让你输入内容,你输入一个内容然后回车,你会发现server那边的控制台就输出了以client发送的内容

通过上面两段代码,我们队网络编程有了一个大概的认识。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python Thrift示例

    Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。本文将从 Python开发人员角度简单介绍 Apach...

    py3study
  • python3对emqtt的简单操作

    py3study
  • python调用wcf服务

    py3study
  • Facebook:对比COPA 与CUBIC,BBR v1在拥塞控制及视频质量的表现

    原文 https://engineering.fb.com/video-engineering/copa/

    LiveVideoStack
  • CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

    张戈博客很久以前分享过一个CC 攻击的防御脚本,写得不怎么样,不过被 51CTO 意外转载了。博客从此走上了经常被人拿来练手的不归之路。 当然,还是有不少朋友在...

    张戈
  • CCKiller:Linux 轻量级 CC 攻击防御工具

    很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了。博客从此走上了经常被人拿来练手的不归之路。当然,还是有不少朋友在生产环境使用,并...

    张戈
  • Facebook:对比COPA 与CUBIC,BBR v1在拥塞控制及视频质量的表现

    原文 https://engineering.fb.com/video-engineering/copa/

    LiveVideoStack
  • VoLTE信令系列--IP短消息

    1).UE_A向拜访域P-CSCF发送REGISTER消息,P-CSCF将该消息转发至归属域S-CSCF发起短消息注册。该消息携带了Contact头域以指示进行...

    用户6184845
  • PL/SQL 集合的初始化与赋值

        对于集合类型,与单一的数据类型相比较而言,应该以一个整体的观念来考虑集合,即是一批类型相同的数据组合而非单一的数据。因此集 合类型集合的声明、赋值、初...

    Leshami
  • redis实战第六篇 手动创建redis cluster

    分布式数据库需要解决数据分区问题,redis cluster采用虚拟槽分区来对数据进行划分。redis cluster的虚拟槽固定为16384个,编号为0~16...

    我是李超人

扫码关注云+社区

领取腾讯云代金券