python怎么网络通信_深入Python中的网络通信

TCP/IP

计算机与网络设备两情侣要谈恋爱,相互通信,那么双方就必须有规则。基于相同的方法,不同的硬件、操作系统之间的通信,都需要一种规则。而我们就把这种规则称为协议(protocol)。

TCP/IP 是互联网相关各类协议族的总称。TCP/IP是指TCP和IP这两种协议。TCP/IP是在IP协议的通信过程中,使用到的协议族的统称。

TCP/IP协议族按层次分别为 应用层,传输层,网络层,数据链路层,物理层。可以按照不同的模型分4层或者是7层。

将TCP/IP分为5层,越靠下越接近硬件。

应用层:应用程序收到传输层的数据后,接下来就是要进行解读,解读必须要先规定好格式,而应用层就是规定应用程序的数据格式,主要协议有HTTP等。

传输层:该层为两台主机上的应用程序提供端到端的通信,传输层有两个传输协议为TCP(传输控制协议)和UDP(用户数据报协议),TCP是一个可靠的面向连接的协议,UDP是不可靠或者说无连接的协议。

网络层:决定如何将数据从发送方到接收方,是建立主机到主机的通信。

数据链路层:控制网络层与物理层之间的通信,主要功能是保证物理线路上进行可靠的数据传递。

物理层:该层负责物理传输,与链路有关,也与传输的介质有关。

客户端和服务器具体的

HTTP

图片出自《图解HTTP》书籍

三次握手,四次挥手

TCP三次握手,四次挥手,Runsen也不会怎么说,就把网上最通俗的图放在下面 了,还是别看我很牛逼,牛逼的是做图的大佬。

三次握手

四次挥手

图片出自公众号(程序员小小溪),更多的名词和概念查找参考公众号程序员小小溪的文章~[1]

Socket

网络编程有一个重要的概念 socket(套接字),应用程序可以通过它发送或接收数据,套接字允许应用程序将 I/O 插入到网络中,并与网络中的其他应用程序进行通信。

我是来偷窥Python中的网络通信Socket,不小心偷窥到了一个非常不错的Socket好图

将上面的图片整理步骤

1.建立连接:

服务器:socket--->address--->bind--->listen--->accept

客户端:socket--->connect

2.通信:收一发:recv(1024)

3.关闭连接:close()

实现简单的通讯程序

服务端,server.py

#导入socket模块

import socket

#创建套接字 或使用server = socket.socket()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#定义绑定的ip和端口,用元组定义

ip_port = ('127.0.0.1', 8888)

#绑定监听:bind(address),在AF_INET下,以元组(ip,port)的形式表示地址

server.bind(ip_port)

#设置最大连接数,默认为1

server.listen(5)

#不断接受连接:one byone

while True:

print("等待数据连接中……")

#接受客服端数据请求

conn, address = server.accept()

'''

向客服端返回信息

(注意:python3.x以上,网络数据的发送接收都是byte类型,

发送接收String类型数据时需要对数据进行编码(发送:messages.enconde();接收后转为String类型:messages.deconde()),pyhon2.x则直接发送数据无须编码)

'''

messages = "连接成功!"

conn.send(messages.encode())

#计数信息条数

count= 0

#一个连接中,不断的接受客户端发来的数据

while True:

data = conn.recv(1024)

#打印客户端发来的数据信息

print(data.decode())

#判断是否退出当前连接,等在下一个连接

if data == b'exit':

break

#处理客户端数据(如:响应请求等)

count=count+ 1

string = "第"+ str(count) +"条信息:"+ data.decode()

conn.send(string.encode())

#主动关闭连接

conn.close()

客户端,client.py

import socket

#创建套接字

client = socket.socket()

#访问的服务器的ip和端口,用元组定义

ip_port = ("127.0.0.1", 8888)

#连接服务器主机

client.connect(ip_port)

#同一链接中,不断向服务器发生数据或请求

while True:

#接收服务器发送或响应的数据

data = client.recv(1024)

#打印接收的数据;python3.x以上数据要编码(发送:data.enconde();接收后转为String类型:data.deconde())

print(data.decode())

messages = input("请输入发生或请求的数据(exit退出):")

client.send(messages.encode())

if messages == 'exit':

break

'''

#接收服务器发送或响应的数据

data = client.recv(1024)

#打印接收的数据;python3.x以上数据要编码,发送enconde();接收deconde()

print(data.decode())

'''

#关闭连接

client.close()

具体效果如下图所示。

多线程通信TCP服务器与多个TCP客户端同时进行连续通信,只需要通过threading创建多线程任务handle_client就可以了。

import socket

import threading

import random

def handle_client():

# 接受客户端请求链接

client, address = server.accept()

print("[*] Accept connection from: %s:%d"% (address[0], address[1]))

messages = "Hello World!"

client.send(messages.encode())

# 连续与当前连接的客户端通信

while True:

# 接受客户端数据

request = (client.recv(1024)).decode()

# 判断是否结束通信

if request == 'exit':

break

print("[*] Received from %s:%d : %s"% (address[0], address[1], request))

# 发送响应信息给客户端

client.send((str(random.randint(1, 1000)) + ":"+"ACK!").encode())

# 关闭当前连接

client.close()

if __name__ == "__main__":

# 创建套接字

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 定义绑定ip和端口

ip = '127.0.0.1'

port = 8888

# 绑定监听

server.bind((ip, port))

# 设置最大连接数,默认为1

server.listen(5)

print("[*] Listening on %s:%d"% (ip, port))

# 循环开启线程,接受多个客户端的链接通信

while True:

# 创建一个线程

client_handler = threading.Thread(target=handle_client)

# 开启线程

client_handler.start()

python3.x以上,网络数据messages的发送接收都是byte类型,若要发送接收String类型数据时需要通过messages.enconde()对数据进行编码,接收后通过messages.deconde()转为String类型。pyhon2.x则直接发送数据无须编码。

本文已收录 GitHub,传送门~[2] ,里面更有大厂面试完整考点,欢迎 Star。

Reference

[1] 参考公众号程序员小小溪的文章:

https://mp.weixin.qq.com/s/KK1dnNoHrbjMyuhQptaBAQ

[2] 传送门~:

https://github.com/MaoliRUNsen/runsenlearnpy100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/538978.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/538978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReadWriteLock读写文件

概述 ReadWriteLock是一个接口,在它里面只定义了两个方法:一个读的锁和一个写的锁。 读的锁:A线程获取了读的锁,那么B线程也可以获取读的锁。 写的锁:A线程获取了写的锁,那么B线程不能获取读也不能获取写…

搞懂 Java HashMap 源码

HashMap 源码分析 前几篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源码,Java 容器除了包含 List 集合外还包含着 Set 和 Map 两个重要的集合类型。而 HashMap 则是最具有代表性的,也是我们最常使用到…

python 怎么表示sqlserver null_如何使用Python将sqlserver查询输出写入.txt文件?

我是Python新手,尝试连接到sqlserverdb并将查询的输出转换成一个flat.txt文件。在一些代码正在工作,但是只写了将近1000条记录,然后就停止了。在Python版本:2.7.13。在下面的代码能够把100万条记录全部写入csv文件而不是.txt文件&…

python中object是什么类型_Python 的 type 和 object 之间是怎么一种关系?

class,metaclass,instance,subclass,base 以下成立: 对任意的A,A是instance(推论:任意class也是instance) 对任意A,存在B,使得B是A的class A是cla…

java8新生代_jdk8.0的jvm详情

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意:使用的jdk版本是jdk8.[work16-11-118qf-pms]$ jstat -class 32417Loaded?? Bytes?? Unloaded?? B…

Java中的Runnable、Callable、Future、FutureTask的区别与示例

原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------------------------- Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念&am…

sql count为空时显示0_C0010负坐标显示为正数+红色0值参考线

小伙伴们早上好啊!今天继续为大家分享柱形图的美化技巧。希望大家认真阅读Excel文件和教程,有的图表看起来简单,实际上在细节处理上用了很多技巧,大家要多多体会。C0010-负坐标显示为正数红色0值参考线效果图图表概述本图可以用来…

配置IISExpress允许外部访问

配置IISExpress允许外部访问 1.找到IISExpress的配置文件&#xff0c;位于 <文档>/IISExpress/config文件夹下&#xff0c;打开applicationhost.config&#xff0c;找到如下代码&#xff1a;<site name"WebSite1" id"1" serverAutoStart"tru…

python布尔测试对象_python布尔类型和逻辑运算

布尔类型 python中True表示真&#xff0c;False表示假&#xff0c;它们是布尔类型&#xff1a;1 2>>> type(True) 在python中&#xff0c;bool的True和False是数值1和0的字符串表示格式&#xff0c;实际上bool类型是int类型的一个子类。1 2>>> bool.__bases_…

mac预装的php路径,Mac使用系统自带php和Apache

最美的语言本文将介绍在Mac环境下如何使用系统本身所带有的Apache(阿帕奇服务器)通过预装的PHP版本来运行PHP的相关代码&#xff0c;相对来讲在OS X系统下相对好配置一些&#xff0c;因为Apache和PHP都预装好了&#xff0c;如果是Windows环境我们需要自己安装ApachePHPMysql(通…

线程池与Callable更配哦

概述 Callable介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53288119 多线程介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53284999 代码 TaskCallable.javapackage multithreading.pool;import java.util.concurrent.Callabl…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

3- OpenCV+TensorFlow 入门人工智能图像处理-TensorFlow入门

tensorflow基础入门 思考一个问题: 如何刚好学习TensorFlow 类比为一门开发语言&#xff0c;学会语法&#xff0c;api的调用&#xff0c; 原理性掌握。语言的要素: 基础数据类型 运算符 流程 字典 数组 import tensorflow as tf# 常量&#xff0c;指定数据类型 data1 tf.const…

r 函数返回多个值_第四讲 R描述性统计分析

在“R与生物统计专题”中&#xff0c;我们会从介绍R的基本知识展开到生物统计原理及其在R中的实现。以从浅入深&#xff0c;层层递进的形式在投必得医学公众号更新。在上一讲中&#xff0c;我们介绍了第三讲 R编程基础-矩阵和数据框 (戳这里即可跳转)。到现在为止&#xff0c;大…

python双线性插值函数_双线性插值法原理 python实现

码字不易&#xff0c;如果此文对你有所帮助&#xff0c;请帮忙点赞&#xff0c;感谢&#xff01;一. 双线性插值法原理&#xff1a;① 何为线性插值&#xff1f;插值就是在两个数之间插入一个数&#xff0c;线性插值原理图如下&#xff1a;在位置 x 进行线性插值&#xff0c;插…

张恩民 php,php100教程_php100张恩民php视频 56课时_网站编程_寂涯网络学习基地

1、PHP基本语法和数据类型&#xff1a;(1)、PHP基本语法&#xff1a;1、htm 和 php 混编2、一个语句以 ; (分号结束)3、如何定义一个变量&#xff0c;和变量的使用(2)、PHP数据运算类型四种标量类型&#xff1a;boolean(布尔型)integer(整型)float(浮点型&#xff0c;也作“do…

Oracle 自带sqldeveloper导入数据到表

步骤 1、建一张字段名和类型与要导入数据一致的表。 2、如果是excel文件&#xff0c;另存为 csv文件。 因为excel文件遇到空格会报错&#xff0c;excel文件太大工具会读取文件失败。 而csv文件是秒级读取&#xff0c;有空格也会导入不会报错。 ------------- 更多的Java&am…

百度腾讯中兴华为全部入局Linux Foundation深度学习基金会

2019独角兽企业重金招聘Python工程师标准>>> 虽然名字叫做Linux Foundation&#xff0c;但是这家基金会关注的领域并不局限在Linux操作系统领域。事实上&#xff0c;Linux Foundation基金会还为很多其他开源基金和项目提供支持&#xff0c;比如Cloud Foundry、Autom…

python判断点在矩形内_判断平面内矩形和圆是否有交点的python实现

#! /usr/bin/env python# -*- coding: utf-8 -*-filename : 平面坐标内矩形与圆是否相交usage :authors : U{peterguo}copyright: tencentdate : 2012.08.21version : 1.0.0.0Modified History:2012.08.21 创建import osimport sysimport reimport urllib2import timeimport da…

python读取mysql数据库_Python操作MySQL数据库9个实用实例

在Windows平台上安装mysql模块用于Python开发 用python连接mysql的时候&#xff0c;需要用的安装版本&#xff0c;源码版本容易有错误提示。下边是打包了32与64版本。 MySQL-python-1.2.3.win32-py2.7.exe MySQL-python-1.2.3.win-amd64-py2.7.exe 实例 1、取得 MYSQL 的版本 #…