python 网络编程 socket

本文介绍了Python中的网络编程基础,重点讲解了Socket的使用。Socket作为应用层与TCP/IP协议族的接口,简化了开发者与运输层协议的交互。通过Socket,我们可以实现类似QQ聊天的通信环境。文中详细阐述了Socket参数,包括服务端和客户端的设置,强调了如SOCK_STREAM协议类型、IP地址和端口的匹配等关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识socket:

首先我们写的网络编程,属于应用层,当我们写好了程序后,需要将数据发送给运输层,

但是应用层和运输层通信需要遵循相关协议,关键是我们不了解运输层的协议,那该怎么办呢?因此提供了Socket层,Socket英文插座,插口,套接字意思。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,让Socket去组织数据,以符合指定的协议。(面向对象的特点,我们只负责编写逻辑即可,不用去管TCP/IP具体的格式,Sockect会帮我们做)。

 socket参数详解:

family

地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域实际上是使用本地 socket 文件来通信)

type

套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 
SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。

我们来模拟一下QQ聊天环境:

服务端:

import socket

server_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sk.bind(('10.10.65.176', 9953))  # 服务端的是绑定----->bind
server_sk.listen(128)
new_socket, addr = server_sk.accept()
print(addr)
while True:  # 设置一个while循环使得可以连续聊天
    # 发送消息
    ret = new_socket.recv(1024).decode('utf-8')
    print('客户端:', ret)
    content = input('请输入内容>>>>>')
    new_socket.send(content.encode('utf-8'))
    if content == 'b': # 设置一个退出
        break
new_socket.close()
server_sk.close()

客户端:

import socket

client_sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sk.connect(('10.10.65.176', 9953))  # 客户端的是------>connect
# 发送消息
while True:
    content = input('请输入----->')
    client_sk.send(content.encode('utf-8'))
    ret = client_sk.recv(1024).decode('utf-8')
    print('服务端:', ret)
    if content == 'b':
        break
client_sk.close()

注意事项:

1.socket.SOCK_STREAM是基于CTP协议的

2. 服务端要绑定ip地址和端口,而服务端是连接服务器的ip和端口

3.服务端和客户端的ip地址和端口号要一致

4.要先运行服务端,然后在运行客户端

 

 

### Python 中使用 `socket` 模块进行网络编程 #### 基本概念 在网络编程中,`Socket` 是一种通信机制,允许程序之间通过网络交换数据。在 Python 中,`socket` 模块提供了一种方式来创建和管理这些套接字对象[^1]。 #### 创建套接字 为了建立连接并传输数据,在 Python 中可以通过调用 `socket.socket()` 函数来实例化一个新的套接字对象。此函数接受几个参数以指定协议族(如 AF_INET 表示 IPv4)、套接字类型(SOCK_STREAM 或 SOCK_DGRAM),以及其他选项[^3]。 ```python import socket # 创建TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` #### 绑定地址与监听请求 对于服务器端应用来说,通常会绑定到特定 IP 地址及端口号,并进入监听状态等待来自客户端的连接请求: ```python server_address = ('localhost', 10000) print('启动服务器...') try: sock.bind(server_address) # 将套接字绑定到本地地址 except Exception as e: print(f'无法绑定 {e}') sock.listen(5) # 开始监听传入连接;最大队列长度为5 ``` #### 接受新连接 当有新的客户尝试连接时,服务器可以调用 accept 方法接收该连接,并返回一个代表已建立连接的新套接字以及对方的信息: ```python connection, client_address = sock.accept() with connection: print('收到连接:', client_address) while True: data = connection.recv(16) if not data: break print('收到来自{}的数据: {!r}'.format(client_address, data)) connection.sendall(data.upper()) ``` 上述代码展示了如何处理简单的回显服务——即把从客户端接收到的消息转换成大写形式再发回去[^2]。 #### 客户端发送消息给服务器 而作为客户端,则需主动发起连接至目标主机上的某个开放端口,并向其发送信息或者读取响应内容: ```python messages = [ '这是第一条消息', '这是第二条消息' ] for message in messages: try: sent = sock.sendto(message.encode(), server_address) amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: data, _ = sock.recvfrom(16) amount_received += len(data) print('收到回复:', data.decode()) finally: print('关闭套接字') sock.close() ``` 这段脚本演示了怎样构建一个基本的 UDP 客户端,它能够依次发送多条短语给远程服务器,并打印出所获得的所有回应。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值