我是靠谱客的博主 能干月光,最近开发中收集的这篇文章主要介绍Python3学习25--网络编程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本系列博文基于廖雪峰老师的官网Python教程,笔者在大学期间已经阅读过廖老师的Python教程,教程相当不错,官网链接: 廖雪峰官方网站.请需要系统学习Python的小伙伴到廖老师官网学习,笔者的编程环境是Anaconda+Pycharm,Python版本:Python3.



1.TCP/IP简介

# 1.IP协议:负责把数据从一台计算机通过网络发送到另一台计算;
# 2.数据被分割成一小块一小块,通过IP包发送出去;
# 3.IP包的特点:按块发送,途经多个路由,但不保证能到达,不保证顺序到达;
# 4.TCP协议:负责在两台计算机间建立可靠连接,保证数据包按顺序到达;
# 5.TCP协议通过握手建立连接,对每个IP包编号,确保对方按顺序收到,如果包丢失,则自动重发;
# 6.TCP报文包含:需要传输的数据,源IP地址,目标IP地址,源端口和目标端口;

2.TCP编程

# 1.用一个Socket表示打开了一个网络链接;
# 2.打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型;

# 创建TCP连接时,主动发起连接的称为客户端,被动响应连接的称为服务器;

# 客户端:
# 创建一个基于TCP连接的Socket
import socket
import threading

# AF_INET:使用IPv4协议;SOCK_STREAM:指定使用面向流的TCP协议;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 参数为tuple,包含地址和端口号;
s.connect(("www.sina.com.cn", 80))

# 发送数据:
s.send(b'GET / HTTP/1.1rnHost: www.sina.com.cnrnConnection: closernrn')

# 接收数据
buffer = []
while True:
    d = s.recv(1024)    # 每次最多接收1K字节
    if d:
        buffer.append(d)
    else:
        break

data = b"".join(buffer)
header, html = data.split(b"rnrn", 1)
print(header.decode("utf-8"))

with open("sina.html", "wb") as f:
    f.write(html)

s.close()    # 关闭连接
# 结果输出:
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sat, 19 Mar 2022 13:49:51 GMT
Content-Type: text/html
Content-Length: 138
Connection: close
Location: https://www.sina.com.cn/
X-Via-CDN: f=edge,s=ctc.guangzhou.union.54.nb.sinaedge.com,c=113.69.180.50;
# 服务器
# socket_server.py
# 交互环境:python socket_server.py
import socket
import threading
import time
# 1.先绑定一个端口并监听来自其他客户端的连接;
# 2.服务器会打开固定端口监听,每来一个客户端连接,就创建该Socket连接;
# 3.一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket;

# 服务器程序:
# 1.创建一个基于IPv4和TCP协议的Socket;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.绑定监听的地址和端口;
s.bind(("127.0.0.1", 9999))

# 3.调用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)
        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)
    
# 4.通过永久循环来接收来自客户端的连接,accept()等待并返回一个客户端的连接;
while True:
    sock, addr = s.accept()  # 接受一个新连接;
    t = threading.Thread(target = tcplink, args = (sock, addr))  # 创建新线程处理TCP连接;
    t.start()
# 客户端程序
# socket_client.py
# 交互环境:python socket_client.py
import socket
import threading
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 9999))

print(s.recv(1024).decode("utf-8"))
for data in [b"Willard", b"Chen", b"WenYu"]:
    s.send(data)
    print(s.recv(1024).decode("utf-8"))
s.send(b"exit")
s.close()

3.UDP编程

# 1.UDP:面向无连接协议;
# 2.使用UDP协议,只需要知道对方的IP地址和端口号即可发送数据包;

# udp_server.py
# 交互环境:python udp_server.py
# 服务器端:
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("127.0.0.1", 9998))    # 绑定端口

print("Bind UDP on 9998...")
while True:
    data, addr = s.recvfrom(1024)
    print("Received from %s:%s." % addr)
    s.sendto(b"Hello, %s!" % data, addr)
# udp_client.py
# 交互环境:python udp_client.py
# 客户端
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b"Willard", b"Chen", b"WenYu"]:
    s.sendto(data, ("127.0.0.1", 9998))
    print(s.recv(1024).decode("utf-8"))
    
s.close()

最后

以上就是能干月光为你收集整理的Python3学习25--网络编程的全部内容,希望文章能够帮你解决Python3学习25--网络编程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(93)

评论列表共有 0 条评论

立即
投稿
返回
顶部