IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> python网络编程(苦肝一夜,近万字) -> 正文阅读

[网络协议]python网络编程(苦肝一夜,近万字)


提示:以下是本篇文章正文内容,下面案例可供参考

一、TCP/IP简介

通信双方必须知道对方的标识。互联网上计算机的唯一标识就是IP地址。通常是网卡。
IP 协议负责把数据从一台计算机通过网络发送到另一台计算机上。数据被分割成一小块,然后通过IP包发送过去。 IP包的特点是按快发送,途径多个路由,但不保证能到达,也不保证顺利到达。
IP地址实际上是一个32位整数(IPv4),以字符串表示的IP地址实际上是把32位整数按8位分组后的数字表示(如192.165.0.1),目的是便于阅读。
TCP协议是建立在IP协议之上的,TCP协议负责在两台计算机之间建立可靠连接,保证数据顺利到达。
一个IP包除了包含传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。 而端口的作用是区分送过来的IP包是给那个程序的。

二、网络设计模块

1.Socket简介

网络编程中有一个基本组件----套接字(socket)
套接字为特定的网络协议(如TCP/IP,UDP/IP)套件对上的网络应用程序提供当前可移植标准的对象。套接字允许程序接收数据并进行连接,为了建立通信通道,网络通信的每个端点拥有一个套接字对象级为重要。

2、python中的socket模块,使用该模块建立服务器需要6个步骤。

1.创建socket对象。

该处使用socket()函数来创建套接字。
语法格式

socket.socket([family[,type[,protoco]]])
  • family :可以是AF_UNIX(用于同一台机器上的进程间通信),也可以是AF_INET(对于IPV4协议的TCP和UDP),或AF_INET6(用于TPV6)
  • type:套接字类型可以根据面向连接和非连接分为SOCK_STREAM(流套接字)或 SOCK_DGRAM(非流套接字)。
  • protoco:一般不填,默认为0.

2.将socket绑定(指派)到指定地址上。

socket.bind(address)

address 必须是一个双元素元组。参数为主机名或ip地址加端口。

3.绑定后必须准备好套接字,以便接收连接。

请求方式如下:

socket.listen(backlog)

backlog 用于指定最多连接数,至少为一。接到连接请求后,这些请求必须排队,如果已满,就拒绝请求。

4.服务器套接字通过socket的accept 方法等待客户请求一个连接。

调用accept方法时,socket会进入等待(或阻塞)状态。客户请求连接时,accept方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的互联网地址。

5.处理阶段,服务器和客户通过send和reext方法通信(传输数据)。

服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recy方法从客户接收信息。调用reev时,必须指定一个整数控制本次调用所接收的最大数据量。recy方法在接收数据时会进入blocket状态,最后返回一个字符串,用于表示收到的数据。如果发送的量超过recy允许的量,数据就会被截断。多余的数据将缓冲于接收端。以后调用recy时,多余的数据会从缓冲区删除。

6.传输结束,服务器调用socket的close方法以关闭连接。

代码案列

import socket #引入套接字模块
#因为服务器需要同时响应多个客户端的请求,每一个连接都需要一个进程或新线程#1处理,否则一次只能服务一个客户
import threading #引入进程模块 
import time 

def socket_server():
    server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#步骤1

    host = socket.gethostname() #获取本地主机名

    port = 5555 #端口号,0-1024 是标准的不能随意使用,1025-9999 可以随意#1使用
    server_socket.bind((host,port)) #参数必须是双元素元组,步骤2
    server_socket.listen(5) #步骤3

    while True:
        #会返回一个含有两个元素的元组。第一个元素是一个新的 socket 对象
        #服务器通过它与客户端通信;第二个元素是客户的互联网地址
        sock,addr = server_socket.accept() #步骤4
   # threading.Thread(target =1,args =2)1 对于函数,2是该函数需要的参数
        t = threading.Thread(target = tcp_link,args = (sock,addr))
        t.start() 

def tcp_link(sock,addr):
    print('Accept new connection from %s:%s...'% addr)
    sock.send('欢迎学校 Python 网络编程!'.encode('utf-8')) #send 发送数据    
    while True:
        data = sock.recv(1024)  #recv 接收数据,最大为一个字节 1024
        time.sleep(1)
        if not data or data.decode('utf-8')=='exit':
            break;
        sock.send(("Hello,%s!"%data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('connection from %s:%s closed.'%addr)

def main():
    socket_server()

if __name__ =='__main__':
    main()


3、python中的socket模块,使用该模块建立客户连接需要4个步骤。

1.创建一个socket以连接服务器。socket=socket.socket(family,type)
2.使用socket 的connect 方法连接服务器。 socket.connect((hoat,port))
3.通过send()与recv()方法通信。
4.结束后,调用socket的close方法以关闭连接。

代码案列:

import socket

def socket_client():
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    host = socket.gethostname()

    port = 5555

    s.connect((host,port)) #连接服务器,指定主机和端口

    print(s.recv(1024).decode('utf-8'))

    for data in ['小青','小白','小花']:
        s.send(data.encode('utf-8'))
        print(s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    s.close()

def main():
    socket_client()

if __name__ =='__main__':
    main()

如何知道服务器端口

1.域名可以自动转换到IP地址。
2.作为服务器,提供服务时端口号必须固定下来。由于我们想要访问网页,因此新浪提供网页服务的服务器必须把端口号固定在80端口。80端口是Web服务的标准端口。其他服务都有对应的标准端口号,如SMTP服务是25端口,FTP服务是21端口,等等。端口号小于1024的是Internet标准服务端口,端口号大于1024的可以任意使用,


## 4、socket 的一些套接字函数。 ### 服务器端。
函数描述
bind()绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
listen()开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来

客户端。

函数描述
connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途。

函数描述
recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
sendall()完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
recvfrom()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
close()关闭套接字
getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
setsockopt(level,optname,value)设置给定套接字选项的值。
getsockopt(level,optname[.buflen])返回套接字选项的值。
settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
fileno()返回套接字的文件描述符。
setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
makefile()创建一个与该套接字相关连的文件

# SocketTool 编程调试工具 参考博文:[添加链接描述](https://blog.csdn.net/xuzhexing/article/details/90763756?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162717578716780274151128%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162717578716780274151128&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-90763756.first_rank_v2_pc_rank_v29&utm_term=python%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B&spm=1018.2226.3001.4187) 工具:SocketTool 1.下载链接: [添加链接描述](http://www.xitongzhijia.net/soft/110847.html) 也可以到百度上搜。

2.在左侧有tcp和udp的客户端或服务端的快捷按钮,上方有【创建】【删除】【退出】等选项按钮。
在这里插入图片描述4 我们先来建立TCP的测试服务端。点击【TCP Server】再点击【创建】。
选择一个监听端口,这里我们使用6001作为服务端的监听端口。
在这里插入图片描述
建立完成后,服务端会自动启动,软件会显示【启动监听】的状态。在这里插入图片描述
建立完成后,服务端会自动启动,软件会显示【启动监听】的状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传t
我们可以检测一下本机的6001端口是否已经打开。在DOS窗口中输入命令【netstat -a】,可以在列表中看到本机的6001端口的状态为listening的状态,表示本机的6001端口正处于监听的状态。
在这里插入图片描述
在DOS窗口中输入命令【telnet 192.168.0.140 6001】来登录本地的6001端口。 注意:192.168.0.140 6001 要根据软件中本机的编号来写。
window下 无法执行 telnet 命令的解决方法
1.打开设置中应用。
2.打开右上角的
在这里插入图片描述
3.
在这里插入图片描述
4.找到telnet 服务,勾选就好
在这里插入图片描述

点击回车键,就可以成功登录6001端口。在测试软件中就可以看到状态是已连接的状态,同时也可以看到对方的ip就是本地ip。

在这里插入图片描述

在软件的发送窗口中输入1234567890,点击发送后,在DOS窗口中就可以看到软件发送过来的数据了。
在这里插入图片描述
若想发送中文不要勾选16进制。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:23:00  更:2021-07-26 12:24:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:47:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码