socket编程(一)使用SOCK_STREAM建立可靠通信

socket是我们用来进行网络编程的基本API,一般系统都提供了socket,unix以及类unix(Linux、mac)它们都提供了socket,不过不同平台还是有那点区别的,其中Windows区别最大了。本文的代码是在mac上测试通过的。

socket是一个应用层编程API,提供了tcp/ip四层模型的第三层传输层的TCP、UDP协议的数据传输方式。第二层网际层有IP协议,它本来是不可靠的协议,而TCP在它的基础上提供了可靠传输。UDP仍然提供不可靠传输。

两个进程若想通信,可以通过socket来进行,不管这两个进程在什么位置,只要它们的主机都实现了TCP/IP协议栈。

我们用网络地址(ip)+port来标识一个通信实体,A要找到B,只需要知道B的ip:port即可。若B处理的是TCP报文,那么A应该指定传输协议是tcp,要是指定个udp或则其它协议,那么B得到了传输层发给应用层的报文将是一个非TCP报文,B在传输层会丢弃这个报文。

传输层TCP报文只用到了port,网际层IP报文用到了ip地址,同时把TCP报文作为它的部分报文内容。

下面是TCP报文,有源port与目的port。报文本身说明了它是TCP报文,在socket中我们如果用TCP协议,那么我们要指定socket用TCP协议。

下面是ip报文,有源ip与目的ip。

根据上面两个报文我们可以看出socket不是一个工作在哪个层上的API,而是一个跨层的网络编程API,为应用层提供服务,我们可以开发一些网络层协议。

服务器端:

socket编程,流程很固定。TCP传输模式是服务器端先创建一个socket,然后把这个socket绑定到一个地址上。这个时候socket可以工作了,让它向tcp/ip协议栈请求一个监听服务并创建一个服务队列来接受那些请求。这个服务队列是什么样子的,我们看下

<think>好的,我需要回答用户关于Python中socket.SOCK_STREAM使用方法和作用的问题。首先,我得回顾socket编程的基础知识。根据引用[1],socket起源于Unix的“切皆文件”哲学,所以socket的操作类似于文件处理,有打开、读写和关闭的步骤。用户提到的SOCK_STREAM应该和TCP协议相关,因为引用[2]提到SOCK_STREAM是基于TCP的,提供可靠的数据传输。而SOCK_DGRAM则是基于UDP的,适用于局域网广播。 接下来,我需要解释socket.SOCK_STREAM的具体含义。它属于流式套接字,用于面向连接的通信。这意味着在数据传输前需要建立连接,确保数据的顺序和可靠性,适合需要准确传输的应用,比如网页浏览或文件传输。 然后,关于使用方法,用户可能需要个具体的例子。根据引用[3],Python的socket模块提供了相关函数,比如socket.socket()创建套接字,bind()绑定地址,listen()开始监听,accept()接受连接等。服务端和客户端的流程不同,服务端需要绑定并监听,而客户端需要连接。数据传输使用send()和recv()方法,最后要close()关闭连接。 需要注意参数设置,比如地址家族AF_INET对应IPv4,这在引用[4]中有说明。此外,异常处理也很重要,比如捕捉错误并关闭连接,防止资源泄露。 最后,应用场景方面,引用[2]提到SOCK_STREAM适合需要可靠传输的情况,如HTTP、FTP等。而SOCK_DGRAM更适合实时性要求高的应用,如视频流或在线游戏。 总结时,要强调SOCK_STREAM的作用和正确使用步骤,确保用户理解TCP的特点和实际编码中的注意事项。同时,生成的相关问题要覆盖协议对比、异常处理和应用场景,帮助用户深入理解。</think>### Python中socket.SOCK_STREAM的含义及用法 #### 1. **`socket.SOCK_STREAM` 的定义** - **含义**:`SOCK_STREAM` 是流式套接字类型,用于面向连接的、可靠的双向字节流通信。它基于 **TCP(传输控制协议)**,确保数据按顺序、无重复地传输[^2]。 - **特点**: - 需要先通过三次握手建立连接(服务端监听、客户端连接)。 - 提供流量控制和拥塞控制,适合需要高可靠性的场景(如文件传输、网页访问)[^2]。 --- #### 2. **核心使用步骤** ##### **服务端代码示例**: ```python import socket # 创建TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET表示IPv4地址族[^4] server_socket.bind(('127.0.0.1', 8080)) # 绑定IP和端口 server_socket.listen(5) # 开始监听,允许最多5个待处理连接 print("等待客户端连接...") client_socket, addr = server_socket.accept() # 接受连接请求 print(f"客户端地址:{addr}") # 接收数据 data = client_socket.recv(1024) # 接收最多1024字节 print(f"收到数据:{data.decode()}") # 发送响应 client_socket.send("已收到".encode()) # 关闭连接 client_socket.close() server_socket.close() ``` ##### **客户端代码示例**: ```python import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('127.0.0.1', 8080)) # 连接服务端 client_socket.send("Hello Server!".encode()) # 发送数据 response = client_socket.recv(1024) print(f"服务端响应:{response.decode()}") client_socket.close() ``` --- #### 3. **关键参数与注意事项** 1. **地址族**: - `AF_INET`:IPv4 地址(如 `'192.168.1.1'`)。 - `AF_INET6`:IPv6 地址。 2. **异常处理**: ```python try: client_socket.connect(('127.0.0.1', 8080)) except ConnectionRefusedError: print("连接被拒绝") finally: client_socket.close() ``` 3. **数据传输**: - 使用 `send()` 和 `recv()` 方法时需处理字节流(通过 `encode()`/`decode()` 转换字符串)。 --- #### 4. **应用场景** - **适合场景**:需可靠传输的场景,如HTTP网页请求、文件下载、数据库连接。 - **对比 `SOCK_DGRAM`**: - `SOCK_DGRAM`(基于UDP)无连接,适用于实时性要求高但允许丢包的场景(如视频通话、在线游戏)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值