Python网络编程

目录

1,网络基础

1,tcp协议

2,udp协议

3,socket简介

二,TCP编程

三,UDP编程

四,TCP和UDP之间的区别

1,网络基础

网络编程是指通过计算机网络进行信息交换与通信的技术。网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。在计算机网络中,最常见的两种通信协议是 TCP 和 UDP。

1,TCP协议

TCP(传输控制协议)是一种面向连接的协议,提供可靠的、按顺序到达的通信服务。TCP 协议通过三次握手建立连接,并通过四次挥手断开连接。其主要特点如下:

  • 面向连接: TCP 需要在数据传输前建立连接。数据传输之前,发送方和接收方需要通过三次握手来确认连接的可靠性。
  • 可靠性: TCP 通过序列号、确认应答、重传机制等方式保证数据的可靠传输。如果数据丢失或损坏,TCP 会自动进行重传。
  • 流量控制: TCP通过滑动窗口技术来控制数据传输速率,防止接收方处理不过来数据
  • 有序性: 数据包的接收顺序由TCP保证,接收方会按序号将数据重新组装。

2,UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它的主要特点是简单、快速,但不保证数据的可靠性和顺序。UDP协议的主要特点如下:

  • 无连接: UDP 不需要建立连接,因此通信双方无需进行握手。
  • 不可靠传输: UDP 不提供确认应答机制,也不保证数据到达的顺序,可能会丢包或出现乱序的情况。
  • 速度较快: 由于不需要建立连接和处理数据传输的复杂性,UDP 在传输过程中速度较快,适合用于实时性要求较高的应用场景。
  • 适用于广播和多播: UDP支持广播和多播,可以在网络中同时向多个接收方发送数据。UDP 适用于那些对实时性要求较高,但不要求数据可靠性保障的场景,例如在线游戏、视频会议等。

3,socket简介

      Socket(套接字)是计算机网络中进程间通信的一种工具,用于实现不同设备或同一设备上不同进程之间的数据传输。它是操作系统提供的网络编程接口,本质上是一个抽象的端点,可以看作是两个程序之间通信链路的 “端点”。

      在 TCP/IP 协议模型中,Socket 通过IP 地址(标识网络中的设备)和端口号(标识设备上的进程)唯一确定一个通信端点。例如,客户端通过连接服务器的 IP 地址和端口号,建立 Socket 连接,从而实现数据交互。

Socket 的核心作用是实现不同主机或进程之间的双向通信,

  • 跨网络通信:连接不同设备允许位于不同物理位置的计算机通过网络(如互联网)进行数据交换。例如,浏览器通过 Socket 连接 Web 服务器获取网页内容。

  • 同一主机内的进程通信:除了跨网络通信,Socket 也可用于同一台计算机上不同进程间的通信(称为本地套接字)。例如,数据库服务与应用程序通过本地 Socket 高效交互,无需经过网络协议栈,性能更高。

二,TCP编程

通过python编程,可以设计一个简单的TCP聊天应用,客户端和服务器通过TCP协议进行通信,客户端发送信息,服务器接收并返回响应

注意:在101服务器进行操作
[root@localhost ~]# vim tcp.py        ##编写tcp客户端
import socket

host='192.168.10.101'
port=12345

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))

s.listen(1)
sock,addr=s.accept()
print('建立连接成功')

info=sock.recv(1024).decode("utf-8")
while info != 'bye':                ##当消息不为bye是继续循环
    if info:                        ##如果消息不为空
        print('收到的信息是:'+info)  ##输出输入的消息
        send_data=input('请输入你要发送的信息:')    ##服务器发送信息
        send_data=str(send_data)         ##转换为字符串
        sock.send(send_data.encode())    ##编码并发送信息
        if send_data=='bye':             ##如果发送服务器信息为bye,则退出循环
            break
    info=sock.recv(1024).decode()        ##接收客户端下一条信息
sock.close()
s.close()

上述代码具体含义

  • import socket:导入socket模块
  • host:指定服务器的ip地址
  • port:指定服务器监听的端口号
  • s=socket.socket(socket.AF_INET,socket.SOCK_STREAM):创建一个TCP客户端的socket,使用IPv4地址族和TCP协议
  • s.bind((host,port)):绑定IP地址和端口号
  • s.listen(1):设置监听最大连接数为1
  • sock,addr=s.accept():接收客户端的连接       accept ##接受
  • info=sock.recv(1024).decode("utf-8"):设置接收大小为1024,解码格式为utf-8
  • sock.close():关闭客户端连接
  • s.close():关闭服务器监听套接字
注意:在102客户端进行操作
[root@localhost ~]# vim tcppy.py 
import socket
s=socket.socket()

host='192.168.10.101'                         ##要连接的服务器
port=12345

s.connect((host,port))                        ##连接成功显示建立连接
print('已经建立连接')

info=''                                       ##初始化接收的消息为空字符串
while info != 'bye':                          ##客户端输入bye退出连接
    send_data=input('请输入你要发送的信息:')   ##获取用户输入
    send_data=str(send_data)                  ##转换为字符串
    s.send(send_data.encode())                ##编码并发送消息
    if send_data=='bye':            
        break
    info=s.recv(1024).decode()               ##接收服务器消息最多1024字节,并进行解码
    print('接收到的信息是:'+info)            ##输出接收的消息
s.close()

验证

[root@localhost ~]# python3 tcppy.py      ##客户端发送
已经建立连接 
请输入你要发送的信息:1


[root@localhost ~]# python3 tcp.py        ##服务器接收,回应客户端
建立连接成功
收到的信息是:1
请输入你要发送的信息:

三,UDP编程

设计一个简单的TCP聊天应用,不仅如此我们还可以使用UDP编写一个简单的聊天应用,客户端发送信息,服务器接收并返回响应

注意:在105服务器进行操作
[root@localhost ~]# vim udp.py 
import socket

host='192.168.10.105'
port=123
server_address = (host, 123)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)

print(f"服务器已启动,监听地址: {server_address}")

while True:
    data, client_address = sock.recvfrom(1024)            ##接收客户端数据报
    message = data.decode('utf-8')                        ##解码为字符串

    if message.lower() == 'exit':                         ##如果客户端发送exit
        print(f"客户端 {client_address} 已断开连接")       ##则退出循环
        break

    print(f"客户端 {client_address}: {message}")          ##打印客户端消息

    # 发送消息到客户端
    reply = input("服务器回复: ")                        ##获取用户输入
    sock.sendto(reply.encode('utf-8'), client_address)  ##编码并发送数据报
  • sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM):使用IPv4协议,并使用UDP协议建立连接
  • sock.bind(server_address):绑定地址和端口,开始监听数据报。
注意:在106客户端进行操作
[root@localhost ~]# vim udppc.py 
import socket

host='192.168.10.105'
port=123
server_address = (host, port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)       

print("客户端已启动,输入'exit'退出聊天")

while True:
    message = input("客户端发送: ")                        ##获取用户输入
    sock.sendto(message.encode('utf-8'), server_address)  ##编码并发送数据报到服务器

    if message.lower() == 'exit':           ##如果用户输入exit,则退出循环
        break

    data, server = sock.recvfrom(1024)      ##接收服务器返回的数据报
    print(f"服务器: {data.decode('utf-8')}") ##解码并打印服务器消息
 
sock.close()

验证

[root@localhost ~]# python3 udp.py 
服务器已启动,监听地址: ('192.168.10.105', 123)


[root@localhost ~]# python3 udppc.py 
客户端已启动,输入'exit'退出聊天
客户端发送: 1


[root@localhost ~]# python3 udp.py 
服务器已启动,监听地址: ('192.168.10.105', 123)
客户端 ('192.168.10.106', 33446): 1
服务器回复: 

四,TCP和UDP之间的区别

使用tcp验证,测试

[root@localhost ~]# python3 tcp.py          ##运行tcp服务器脚本时未连接不会有任何响应


 [root@localhost ~]# python3 tcppy.py         ##直到客户端建立连接
已经建立连接
请输入你要发送的信息:


[root@localhost ~]# python3 tcp.py      ##服务器才会响应
建立连接成功

使用udp验证,测试

[root@localhost ~]# python3 udp.py              ##udp启动就开始监听地址,等待客户端发送信息
服务器已启动,监听地址: ('192.168.10.105', 123)


[root@localhost ~]# python3 udppc.py     
客户端已启动,输入'exit'退出聊天 
客户端发送:


主要区别:
TCP 需要显式建立和关闭连接
UDP 无需连接,但每次发送需指定目标地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值