python的socket基本使用

本文提供了一个使用 Python 的 socket 库实现的基本客户端-服务器通信示例。服务器监听本地 5000 端口并接收来自客户端的消息,之后回复确认信息。客户端连接到服务器并发送一条消息,然后打印接收到的回复。

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








server.py: 

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 5000))
s.listen(1)

while True:
    cs, ca = s.accept()
    print cs.recv(1024)
    cs.sendall('reply')
    cs.close()

client.py:

import socket

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(('127.0.0.1', 5000))
c.send('hello')
print c.recv(1024)
c.close()





<think>好的,用户想了解Pythonsocket模块的基本使用。首先,我需要回忆一下socket模块的主要功能和基本概念。Socket是网络通信的基础,用于不同计算机之间的数据传输。Python中的socket模块提供了低层次的网络通信接口,支持TCP和UDP协议。 首先,用户可能需要知道如何创建socket对象。记得是使用socket.socket()函数,需要指定地址族(如AF_INET)和套接字类型(SOCK_STREAM或SOCK_DGRAM)。TCP用的是SOCK_STREAM,而UDP是SOCK_DGRAM。 接下来,TCP服务器和客户端的流程是关键。服务器端需要绑定地址和端口,监听连接,然后接受客户端的连接。客户端则需要连接到服务器。需要详细说明每个步骤的方法,比如bind(), listen(), accept(), connect()等。 然后是数据传输部分,send()和recv()方法的使用,需要注意字节流的处理,字符串需要编码成bytes。此外,循环接收数据直到结束的情况,比如判断是否接收到空数据来关闭连接。 UDP的实现可能也需要提及,因为和TCP有所不同。UDP是无连接的,服务器不需要listen和accept,直接recvfrom,而客户端使用sendto。 可能还需要提醒常见的错误和注意事项,比如端口占用、异常处理、正确的关闭连接等。例如,使用try-except块来捕捉异常,以及finally中关闭套接字。 用户可能想知道一个简单的例子,比如一个回声服务器和客户端的代码示例。需要确保代码正确,步骤清晰,注释到位。同时,强调套接字使用后的关闭,避免资源泄漏。 另外,可能需要比较TCP和UDP的区别,帮助用户根据需求选择合适的协议。比如TCP可靠,面向连接,适合文件传输;UDP快速,无连接,适合实时应用。 还要注意中文表述的清晰,结构分步骤,让用户容易跟随。可能需要分点说明,比如服务器步骤、客户端步骤、代码示例、注意事项等。 最后,检查是否有遗漏的重要点,比如超时设置、非阻塞模式、多线程处理多个连接等。但用户可能只需要基本使用,所以高级内容可以简要提及或省略,保持回答简洁。 总结下来,回答的结构应该是先介绍socket模块的作用,然后分别讲解TCP和UDP的使用步骤,提供代码示例,最后列出注意事项和常见问题。确保每个部分都清晰,步骤明确,帮助用户逐步理解和实现网络通信的基本功能。</think>Python的`socket`模块是网络编程的核心工具,用于实现TCP/UDP协议通信。以下分步骤说明基本使用方法: --- ### 一、TCP通信流程 #### 服务器端步骤 1. **创建套接字** ```python import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 2. **绑定地址和端口** ```python server_socket.bind(('127.0.0.1', 8888)) # 绑定本地回环地址和端口 ``` 3. **开始监听** ```python server_socket.listen(5) # 最大等待连接数 ``` 4. **接受客户端连接** ```python client_socket, client_addr = server_socket.accept() # 阻塞直到有连接 print(f"连接来自:{client_addr}") ``` 5. **接收和发送数据** ```python data = client_socket.recv(1024) # 接收最多1024字节 client_socket.send(b"Server Received: " + data) ``` 6. **关闭连接** ```python client_socket.close() server_socket.close() ``` #### 客户端步骤 ```python client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8888)) # 连接服务器 client.send(b"Hello Server!") response = client.recv(1024) print("收到回复:", response.decode()) client.close() ``` --- ### 二、UDP通信流程 #### 服务器端 ```python udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_server.bind(('127.0.0.1', 9999)) data, addr = udp_server.recvfrom(1024) # 同时获取数据和客户端地址 udp_server.sendto(b"UDP Response", addr) ``` #### 客户端 ```python udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_client.sendto(b"Hello UDP", ('127.0.0.1', 9999)) response, _ = udp_client.recvfrom(1024) print("UDP回复:", response.decode()) ``` --- ### 三、关键方法说明 - `socket.socket(family, type)` 创建套接字对象,`family`常用`AF_INET`(IPv4),`type`可选`SOCK_STREAM`(TCP)或`SOCK_DGRAM`(UDP) - `bind((host, port))` 绑定服务器到指定地址和端口 - `listen(backlog)` 启动TCP监听,`backlog`定义最大排队连接数 - `accept()` 返回`(client_socket, client_address)`元组 - `connect((host, port))` 客户端连接服务器 - `send()`/`recv()` TCP发送/接收数据(需处理字节流) - `sendto()`/`recvfrom()` UDP发送/接收数据(附带地址信息) --- ### 四、注意事项 1. **字节编码** 所有发送的数据需转换为字节(如`b"text"`或`str.encode()`) 2. **端口释放** 关闭程序后端口可能被系统保留,可通过`socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)`设置重用 3. **异常处理** 使用`try...except`捕捉`ConnectionResetError`等异常 4. **多客户端处理** TCP服务器需配合多线程处理并发: ```python while True: client, addr = server_socket.accept() threading.Thread(target=handle_client, args=(client,)).start() ``` --- ### 五、简单示例:TCP回声服务器 ```python # server.py import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('0.0.0.0', 65432)) server.listen() while True: conn, addr = server.accept() with conn: while True: data = conn.recv(1024) if not data: break conn.sendall(data) ``` ```python # client.py import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('localhost', 65432)) client.send(b"Hello Echo Server") print("收到回声:", client.recv(1024).decode()) client.close() ``` --- 掌握这些基础操作后,可进一步学习`select`模块处理I/O多路复用,或使用`socketserver`简化服务器开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值