[5]网络编程-【2】socket编程(socket编程的基本过程)

[5]网络编程-【2】socket编程(socket编程的基本过程)

编码文章call10242025-02-01 3:11:3814A+A-

在Python中,使用socket模块可以实现网络通信,包括创建网络连接、发送和接收数据等操作。下面是一个简单的socket编程的学习教程,涵盖了基本的socket编程知识和示例代码。

简介

socket是Python中用于进行网络通信的标准库。它提供了一种简单而强大的方式来创建、连接、发送和接收数据,从而实现网络通信。socket库支持多种网络协议,包括TCP/IP和UDP等。

在socket编程中,通常有两种角色:服务器和客户端。服务器负责监听端口并等待客户端的连接请求,而客户端则负责连接服务器并发送/接收数据。

下面是一些常用的socket术语:

  • IP地址:是用于在网络中唯一标识设备的地址,它通常由4个整数组成,例如:192.168.0.1。
  • 端口号:是用于标识网络应用程序的地址,它是一个16位的整数,取值范围是0到65535。其中,0到1023的端口号通常是系统保留端口号,而1024到65535的端口号可以由应用程序使用。
  • 协议:是网络通信中使用的规则集,它定义了数据传输的格式和处理方式。常见的协议有TCP(传输控制协议)和UDP(用户数据报协议)。

创建Socket

在Python中,可以通过socket模块的socket函数来创建一个socket对象,语法如下:

import socket

# 创建TCP socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建UDP socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

socket.AF_INET表示使用IPv4地址族,socket.SOCK_STREAM表示使用TCP协议(面向连接的协议),socket.SOCK_DGRAM表示使用UDP协议(无连接的协议)。

服务器端

在服务器端,首先需要创建一个socket对象,并绑定到一个IP地址和端口号上,然后开始监听客户端的连接请求,最后通过接受客户端的连接来与客户端进行通信。

以下是一个简单的TCP服务器的示例代码:

import socket

# 创建TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_address = ('127.0.0.1', 8888)  # 使用本地回环地址和自定义端口号
server_socket.bind(server_address)

# 监听连接请求
server_socket.listen(5)  # 最多允许5个连接请求同时等待

print('服务器已启动,等待客户端连接...')

while True:
    # 接受客户端的连接请求
    client_socket, client_address = server_socket.accept()

    print('与客户端', client_address, '建立连接')

    # 向客户端发送欢迎消息
    welcome_message = '欢迎连接到服务器!'
    client_socket.send(welcome_message.encode())

while True:
    # 接收客户端发送的数据
    data = client_socket.recv(1024)
    if not data:
        # 如果客户端断开连接,则退出循环
        print('客户端', client_address, '断开连接')
        break

    # 处理接收到的数据
    received_data = data.decode()
    print('接收到客户端', client_address, '的消息:', received_data)

    # 向客户端发送回复消息
    reply_message = '服务器已收到您的消息:' + received_data
    client_socket.send(reply_message.encode())

# 关闭与客户端的连接
client_socket.close()

在以上示例中,首先创建了一个TCP socket对象,并通过`bind()`方法将其绑定到IP地址和端口号上。然后通过`listen()`方法开始监听连接请求。在无限循环中,通过`accept()`方法接受客户端的连接请求,返回一个新的socket对象和客户端的地址。接着,可以通过新的socket对象与客户端进行通信,例如发送和接收数据。当客户端断开连接时,关闭与客户端的连接。

类似地,可以创建一个UDP服务器,示例如下:

import socket

# 创建UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定IP地址和端口号
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)

print('服务器已启动,等待客户端消息...')

while True:
    # 接收客户端发送的数据和地址
    data, client_address = server_socket.recvfrom(1024)

    # 处理接收到的数据
    received_data = data.decode()
    print('接收到客户端', client_address, '的消息:', received_data)

    # 向客户端发送回复消息
    reply_message = '服务器已收到您的消息:' + received_data
    server_socket.sendto(reply_message.encode(), client_address)

在以上示例中,通过recvfrom()方法接收客户端发送的数据和地址,然后处理数据并向客户端发送回复消息。

客户端

在客户端,需要创建一个socket对象,并连接到服务器的IP地址和端口号,然后通过发送和接收数据与服务器进行通信。

以下是一个简单的TCP客户端的示例代码:

import socket

# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
server_address = ('127.0.0.1', 8888)
client_socket.connect(server_address)

print('已连接到服务器', server_address)

while True:
    # 向服务器发送数据
    message = input('请输入要发送的消息(输入quit退出):')
    client_socket.send(message.encode())

    if message == 'quit':
        # 如果输入quit,则退出循环
        break

    # 接收服务器的回复消息
    data = client_socket.recv(1024)
    received_data = data.decode()
		print('接收到服务器的回复消息:', received_data.decode())

# 关闭与服务器的连接
client_socket.close()

在以上示例中,首先创建了一个TCP socket对象,并通过`connect()`方法连接到服务器的IP地址和端口号。在循环中,通过`send()`方法向服务器发送数据,并通过`recv()`方法接收服务器的回复消息,并进行解码后打印出来。当输入'quit'时,退出循环并关闭与服务器的连接。

类似地,可以创建一个UDP客户端,示例如下:

import socket

# 创建UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 服务器地址和端口号
server_address = ('127.0.0.1', 8888)

while True:
    # 向服务器发送数据
    message = input('请输入要发送的消息(输入quit退出):')
    client_socket.sendto(message.encode(), server_address)

    if message == 'quit':
        # 如果输入quit,则退出循环
        break

    # 接收服务器的回复消息
    data, _ = client_socket.recvfrom(1024)
    received_data = data.decode()
    print('接收到服务器的回复消息:', received_data)

# 关闭socket
client_socket.close()

在以上示例中,通过sendto()方法向服务器发送数据,并通过recvfrom()方法接收服务器的回复消息,并进行解码后打印出来。当输入'quit'时,退出循环并关闭socket。

总结

这只是socket编程的基础,实际上socket提供了丰富的功能和选项,可以进行更复杂的网络通信操作。可以根据实际需求进行进一步学习和探索。希望这个简单的socket编程学习教程对你有帮助!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4