网络编程

Posted lws865

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发

出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

 

Socket简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供

可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

 

socket模块 在python的socket编程中,实用socket模块的时候,是不能实现多个连接的,当然如果加入其它的模块是可以的,例如select模块,在这里见到的介绍下socketserver模块。 socketserver,看其名字,就知道是

一个socket的服务器模块的使用,在这个模块中,主要也就是实现服务器类的相关功能,在其中,也就是将socket模块和select模块进行了封装,从而创建了一些基类供人使用。

 

服务器端套接字函数

s.bind():绑定地址(主机名、端口号对)到套接字

s.listen():开始TCP监听

s.accept():被动接受TCP客户端连接,(阴塞式)等待连接的到来

客户端套接字函数

s.connect():主动初始化TCP服务器连接

s.connect_ex():connect()函数的扩展版本,出错时返回出错码,而不是执出异常

 

服务器

服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。 所以,服务器会打开固定端口(比如80)监听,每来一

个客户端连接,就创建该Socket连接。由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯

一确定一个Socket。 但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。

 

客户端

大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。

如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。

 

UDP编程

1.TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。

 

2.使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

3.虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

 

urllib模块

urllib是python内置的HTTP请求库,无需安装即可使用,它包含了4个模块:

request:它是最基本的http请求模块,用来模拟发送请求

error:异常处理模块,如果出现错误可以捕获这些异常

parse:一个工具模块,提供了许多URL处理方法,如:拆分、解析、合并等

robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬

  GET请求

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应

如果我们要想模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,我们就可以把请求伪装成浏览器

POST请求

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应

如果我们要想模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,我们就可以把请求伪装成浏览器

 

HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-Type

字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括: application/x-www-form-urlencoded 最

常见post提交数据的方式,以form表单形式提交数据。 application/json 以json串提交数据。 multipart/form-data 一般使用来上传文件。

 

UDP服务端

 

 1 import socket
 2 
 3 #1.创建套接字
 4 udp_s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 5 
 6 #2.绑定IP和端口号
 7 udp_s.bind((192.168.1.102,4395))
 8 
 9 while True:
10     #接收消息
11     #data是从客户端发送过来的消息,addr是元组格式,存储IP和端口号
12     data,addr = udp_s.recvfrom(1025)
13     print(addr)
14     #打印出客户端发送过来的消息,data.decode(‘utf-8,‘):将字符转为中文格式
15     print(data.decode(utf-8,),addr)
16     #udp_s.sendto:发送消息。
17     udp_s.sendto(服务器发送的消息.encode(utf-8),addr)
18 
19 #关闭套接字
20 udp_s.close()

 

UDP客户端

 1 import socket
 2 
 3 #创建套接字
 4 udp_c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 5 
 6 #绑字端口号
 7 udp_c.bind((192.168.1.102,6969))
 8 
 9 #发送消息
10 udp_c.sendto(客户端发送的消息.encode(utf-8),(192.168.1.102,4399))
11 
12 #接收消息
13 data,addr = udp_c.recvfrom(1024)
14 print(data.decode(utf-8),addr)
15 udp_c.close()

 

以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?