python socket通信原理_Socket通信原理简介

何谓socket

计算机,顾名思义即是用来做计算。因而也需要输入和输出,输入需要计算的条件,输出计算结果。这些输入输出可以抽象为I/O(input output)。

Unix的计算机处理IO是通过文件的抽象。计算机不同的进程之间也有输入输出,也就是通信。因此这这个通信也是通过文件的抽象文件描述符来进行。

在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(socket)。socket就是在不同计算机之间进行通信的一个抽象。他工作于TCP/IP协议中应用层和传输层之间的一个抽象。如下图:

socket.jpg

服务器通信

socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是客户端服务器之间的通信。两个端都建立一个socket对象,然后通过socket对象对数据进行传输。通常服务器处于一个无线循环,等待客户端连接:

socket3.jpg

socket 通信实例

socket接口是操作系统提供的,调用操作系统的接口。当然高级语言一般也封装了好用的函数接口,下面用python代码写一个简单的socket服务端例子:

server.py

import socket

HOST = 'localhost' # 服务器主机地址

PORT = 5000 # 服务器监听端口

BUFFER_SIZE = 2048 # 读取数据大小

# 创建一个套接字

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定主机和端口

sock.bind((HOST, PORT))

# 开启socket监听

sock.listen(5)

print 'Server start, listening {}'.format(PORT)

while True:

# 建立连接,连接为建立的时候阻塞

conn, addr = sock.accept()

while True:

# 读取数据,数据还没到来阻塞

data = conn.recv(BUFFER_SIZE)

if len(data):

print 'Server Recv Data: {}'.format(data)

conn.send(data)

print 'Server Send Data: {}'.format(data)

else:

print 'Server Recv Over'

break

conn.close()

sock.close()

client.py

import socket

HOST = 'localhost'

PORT = 5000

BUFFER_SIZE = 1024

# 创建客户端套接字

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器

sock.connect((HOST, PORT))

try:

message = "Hello"

# 发起数据给服务器

sock.sendall(message)

amount_received = 0

amount_expected = len(message)

while amount_received < amount_expected:

# 接收服务器返回的数据

data = sock.recv(10)

amount_received += len(data)

print 'Client Received: {}'.format(data)

except socket.errno, e:

print 'Socket error: {}'.format(e)

except Exception, e:

print 'Other exception: %s'.format(e)

finally:

print 'Closing connection to the server'

sock.close()

TCP 三次握手

python代码写套接字很简单。传说的TCP三次握手又是如何体现的呢?什么是三次握手呢?

第一握:首先客户端发送一个syn,请求连接,

第二握:服务器收到之后确认,并发送一个 syn ack应答

第三握:客户端接收到服务器发来的应答之后再给服务器发送建立连接的确定。

用下面的比喻就是

C:约么?

S:约

C:好的

约会

这样就建立了一个TCP连接会话。如果是要断开连接,大致过程是:

tcp.png

上图也很清晰的表明了三次握手的socket具体过程。

客户端socket对象connect调用之后进行阻塞,此过程发送了一个syn。

服务器socket对象调用accept函数之后阻塞,直到客户端发送来的syn,然后发送syn和ack应答

客户端socket对象收到服务端发送的应答之后,再发送一个ack给服务器,并返回connect调用,建立连接。

服务器socket对象接受客户端最后一次握手确定ack返回accept函数,建立连接。

至此,客户端和服务器的socket通信连接建立完成,剩下的就是两个端的连接对象收发数据,从而完成网络通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,socket.AF_BLUETOOTH是用于创建蓝牙套接字的常量。你可以使用它来与蓝牙设备进行通信。它是一个在socket模块中定义的常量,用于指定套接字家族的类型。具体来说,AF_BLUETOOTH常量用于创建用于蓝牙通信的套接字。你可以通过以下代码创建一个蓝牙套接字: ```python import socket bluetooth_socket = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) ``` 在这个例子中,我们使用socket.socket函数创建了一个蓝牙套接字对象bluetooth_socket。第一个参数指定了套接字的家族类型为蓝牙(AF_BLUETOOTH),第二个参数指定了套接字的类型为流式套接字(SOCK_STREAM),第三个参数指定了套接字的协议为RFCOMM(BTPROTO_RFCOMM)。 请注意,使用蓝牙套接字需要你的计算机支持蓝牙功能,并且你的代码必须遵循蓝牙协议和规范。具体的蓝牙通信操作和协议细节超出了本回答的范围,请根据你的具体需求查阅相关文档和资源来学习更多关于蓝牙通信的知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python - AttributeError:模块'socket'没有属性'AF_PACKET' - 堆栈内存溢出](https://blog.csdn.net/weixin_39599317/article/details/110080791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [pythonsocket --- 底层网络接口](https://blog.csdn.net/weixin_39145520/article/details/129396132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值