Python:网络编程
2021/4/12 20:25:56
本文主要是介绍Python:网络编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
网络通信是两台计算机上的两个进程之间的通信
一、TCP编程
服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接,一个Socket依赖4项:
服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。
客户端发起tcp连接
import socket import ssl s=ssl.wrap_socket(socket.socket()) #建立连接: s.connect(('www.sina.com.cn',443)) #发送数据: s.send(b'GET/HTTP/1.1\r\nHost:www.sina.com.cn\r\nConnection:close\r\n\r\n') # 接收数据: buffer = [] while True: # 每次最多接收1k字节: d = s.recv(1024) if d: buffer.append(d) else: break data = b''.join(buffer) #关闭连接: s.close() header, html = data.split(b'\r\n\r\n', 1) print(header.decode('utf-8')) # 把接收的数据写入文件: with open('try.html', 'wb') as f: f.write(html)
服务器:
import socket,threading,time #AF_INET指定使用IPv4协议、SOCK_STREAM指定使用面向流的TCP协议 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #监听端口: s.bind(('127.0.0.1',1056)) #调用listen()方法开始监听端口,传入参数指定等待连接的最大数量: s.listen(5) print("waiting for connection...") #每个连接都必须创建新线程来处理,否则无法接收其他客户端的连接: def tcplink(sock,addr): print('Accept new connection from %s:%s...'% addr) sock.send(b'Welcome!') while True: #接收客户端发来的信息 data = sock.recv(1024) time.sleep(1) #如果数据流为空,或者客户端发送来exit信息则退出连接 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) # 通过一个永久循环来接收客户端的连接、accept()会等待并返回一个客户端的连接: while True: #一直处在监听状态 sock,addr=s.accept() #返回新网络连接tcp,客户端ip地址 #创建线程进程操作tcp t=threading.Thread(target=tcplink,args=(sock,addr)) #启动线程 t.start()
客户端:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('127.0.0.1', 1056)) # 接收欢迎消息: print(s.recv(1024).decode('utf-8')) for data in [b'Michael', b'Tracy', b'Sarah']: # 发送数据: s.send(data) print(s.recv(1024).decode('utf-8')) s.send(b'exit') s.close()
Web服务标准端口是80,SMTP服务是25端口,FTP服务是21端口,端口号小于1024的是Internet标准服务的端口,端口号大于1024的可以任意使用。
要绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址。
127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
二、UDP编程
TCP建立可靠连接,并且通信双方都可以以流的形式发送数据。
UDP协议不需要建立连接,传输数据不可靠,但速度快。
UDP的通信双方也分为客户端和服务器:
服务器:
import socket #SOCK_DGRAM指定scoket类型是UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口: s.bind(('127.0.0.1', 9999)) print('Bind UDP on 9999...') #不需要调用listen()方法,直接接收来自任何客户端的数据: while True: # 接收数据: data, addr = s.recvfrom(1024) #返回客户端地址与接口 print('Received from %s:%s.' % addr) s.sendto(b'Hello, %s!' % data, addr) #服务器接到数据后,调用sendto()可以把数据发给客户端
客户端:
import socket #不需要调用connect(),直接通过sendto()给服务器发数据: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for data in [b'Michael', b'Tracy', b'Sarah']: # 发送数据: s.sendto(data, ('127.0.0.1', 9999)) # 接收数据: print(s.recv(1024).decode('utf-8')) s.close()
服务器绑定UDP端口和TCP端口互不冲突。
【本博客中Python基础笔记均是在廖雪峰的官方网站学习过程中记录的,仅作参考】
这篇关于Python:网络编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门