python网络编程

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

1:网络基础

1.1:TCP协议

1.2:UDP协议

1.3:socket简介

2:TCP编程

2.1:TCP客户端示例

2.2:TCP服务器示例

3:UDP编程

3.1:UDP客户端示例

3.2:UDP服务器示例

4:小案例:简易聊天应用

4.1:TCP聊天服务器

4.2:TCP聊天客户端


1:网络基础

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

1.1:TCP协议

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

面向连接:通信前需建立连接(三次握手),结束后释放连接(四次挥手)。

可靠传输:通过确认、重传、流量控制和拥塞控制确保数据无差错、不丢失、不重复且有序。

全双工通信:支持双向数据传输。

字节流传输:数据被视为无结构的字节流,无固定边界。

1.2:UDP协议

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

无连接:无需建立连接,直接发送数据。

不可靠传输:不保证数据到达、顺序或完整性,无重传机制。

高效:首部开销小(8字节),传输速度快。

面向报文:保留数据边界,每次发送一个完整报文。

1.3:socket简介

  • 定义:Socket是应用层与传输层之间的抽象接口,提供网络通信的编程接口。

  • 作用:实现不同主机或同一主机上的进程间通信。

  • 类型

    • 流式Socket(SOCK_STREAM):基于TCP,可靠、面向连接。

    • 数据报Socket(SOCK_DGRAM):基于UDP,无连接、不可靠。

    • 原始Socket(SOCK_RAW):直接访问底层协议(如IP、ICMP)。

  • 工作流程(以TCP为例):

    1. 服务端:创建Socket → 绑定IP和端口(bind)→ 监听(listen)→ 接受连接(accept)。

    2. 客户端:创建Socket → 连接服务端(connect)。

    3. 数据传输:双方通过send/recv通信。

    4. 关闭连接:调用close释放资源。

2:TCP编程

2.1:TCP客户端示例

import socket

def tcp_client():
    # 创建一个TCP客户端socket
    # AF_INET表示IPv4协议,SOCK_STREAM表示TCP协议
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 连接到服务器(IP和端口)
    client_socket.connect(('127.0.0.1', 12345))

    # 发送数据
    message = 'Hello, Server'
    client_socket.send (message.encode ('utf-8')) # 发送数据时需要进行编码

    #接收服务器响应
    response = client_socket.recv (1024) # 接收最多 1024 字节的数据
    print ('Received from server:', response.decode ('utf-8')) # 接收到的数据需要解码

    #关闭连接
    client_socket.close()

if name == 'main':
    tcp_client()

代码解析:

  • socket.socket (socket.AF_INET, socket.SOCK_STREAM):创建一个 TCP 客户端 Socket,使用 IPv4 地址族(AF_INET)和 TCP 协议(SOCK_STREAM)。
  • client_socket.connect (('127.0.0.1', 12345)):通过 IP 地址和端口连接到服务器。
  • client_socket.send ():将数据发送到服务器,数据需要进行编码(encode ('utf-8'))。
  • client_socket.recv ():接收来自服务器的数据,最多接收 1024 字节。
  • client_socket.close ():关闭客户端 Socket 连接。

2.2:TCP服务器示例

import socket

def tcp_server():
    #创建一个 TCP 服务器 socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #绑定服务器地址和端口
    server_socket.bind(('127.0.0.1', 12345))
    
    #开始监听连接,最大连接数为 5
    server_socket.listen(5)
    print('Server is listening...')

    while True:
        #接受客户端连接
        client_socket, client_address = server_socket.accept()
        print(f'Connection from {client_address}')

        #接收客户端消息
        message = client_socket.recv(1024)
        print(f'Received message: {message.decode("utf-8")}')

        #发送响应
        client_socket.send (b'Hello, Client') # 发送响应数据,需要编码成字节形式

        #关闭连接
        client_socket.close()

if name == 'main':
    tcp_server()

代码解析:

  • server_socket.bind (('127.0.0.1', 12345)): 绑定服务器的 IP 地址和端口。
  • server_socket.listen (5): 开始监听连接,最大连接数为 5。
  • server_socket.accept (): 接受客户端连接。
  • client_socket.recv (1024): 接收客户端消息。
  • client_socket.send (b'Hello, Client'): 向客户端发送响应消息。
  • client_socket.close (): 关闭与客户端的连接。

3:UDP编程

3.1:UDP客户端示例

import socket

def udp_client():
    # 创建UDP客户端socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 发送数据
    message = 'Hello, UDP Server'
    client_socket.sendto(message.encode('utf-8'), ('127.0.0.1', 12345))  # 发送数据并指定目标地址

    # 接收服务器响应
    response, server_address = client_socket.recvfrom(1024)  # 接收数据和服务器地址
    print('Received from server:', response.decode('utf-8'))

    # 关闭socket
    client_socket.close()

if __name__ == '__main__':
    udp_client()

代码解析:

  • socket.socket (socket.AF_INET, socket.SOCK_DGRAM): 创建 UDP 客户端 Socket。
  • client_socket.sendto (): 发送数据到指定的目标地址和端口。
  • client_socket.recvfrom (): 接收来自服务器的响应,返回接收到的数据和服务器地址。

3.2:UDP服务器示例

import socket

def udp_server():
    # 创建UDP服务器socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定服务器地址和端口
    server_socket.bind(('127.0.0.1', 12345))
    print('Server is listening...')

    while True:
        # 接收客户端消息
        message, client_address = server_socket.recvfrom(1024)  # 接收数据和客户端地址
        print(f'Received message: {message.decode("utf-8")}')

        # 发送响应
        server_socket.sendto(b'Hello, UDP Client', client_address)  # 向客户端发送响应

if __name__ == '__main__':
    udp_server()

代码解析:

  • server_socket.bind (('127.0.0.1', 12345)): 绑定服务器的 IP 地址和端口。
  • server_socket.recvfrom (1024): 接收来自客户端的数据,并返回数据和客户端地址。
  • server_socket.sendto (): 向指定客户端地址发送响应数据。

4:小案例:简易聊天应用

4.1:TCP聊天服务器

101(服务器):

vim server.com
import socket		#导入模块

host='192.168.10.101'		#定义监听内容
port=12345

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#socket.AF_INET网络层协议
#socket.SOCK_STREAM传输层协议
s.bind((host,port))

s.listen(1)

sock,addr=s.accept()

print('建立连接成功')

info=sock.recv(1024).decode()

while info !='bye':
	if info:
		print('收到的信息是:'+info)
		send_data=input('请输入你要发送的信息:')
		send_data=str(send_data)
		sock.send(send_data.encode())
		if send_data=='bye':
			break
	info=sock.recv(1024).decode()
sock.close()
s.close()

#运行server.py
python3 server.py

4.2:TCP聊天客户端

102(客户端):

vim client.py
s=socket.socket()

host='192.168.10.101'		#定义监听内容
port=12345

s.connect((host,port))

print('已经建立连接')

info=''
while info !='bye':
	send_data=input('请输入你要发送的信息:')
	
	send_data=str(send_data)
	s.send(send_data.encode())
	if send_data=='bye':
		break
	info=s.recv(1024).decode()
	print('收到的信息是:'+info)
s.close()

#先运行server.py
python3 server.py
#再运行client.py
python3 client.py


网站公告

今日签到

点亮在社区的每一天
去签到