网站建设报告论文百度文库,区块链网站建设,网站登录页面盗号怎么做,河南省建设厅处长名单文章目录 版权声明python3编码转换socket类的使用创建Socket对象Socket对象常用方法和参数使用示例服务器端代码客户端代码 TCP客户端程序开发流程TCP服务端程序开发流程TCP网络应用程序注意点socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析图 多任务版… 文章目录 版权声明python3编码转换socket类的使用创建Socket对象Socket对象常用方法和参数使用示例服务器端代码客户端代码 TCP客户端程序开发流程TCP服务端程序开发流程TCP网络应用程序注意点socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析图 多任务版TCP服务端程序开发 版权声明
本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用并非商业用途。我在整理学习笔记的过程中尽力确保准确性但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。若您是黑马程序员或相关权利人如有任何侵犯版权的地方请您及时联系我我将立即予以删除或进行必要的修改。对于其他读者请在阅读本博客内容时保持遵守相关法律法规和道德准则谨慎参考并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人不代表黑马程序员的立场。
python3编码转换
在网络传输数据的时候数据需要先编码转化为二进制bytes数据类型
函数名说明encode编码 将字符串转化为字节码decode解码 将字节码转化为字符串
encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。bytes.decode(encoding“utf-8”)
str.encode(encoding”utf-8”)socket类的使用
Python的 socket 类是Python标准库的一部分用于提供对低级网络接口的访问。支持IPv4、IPv6、TCP、UDP等协议允许创建基于网络的应用程序如服务器和客户端。
创建Socket对象
要使用 socket 类首先需要导入 socket 模块然后创建一个 socket 对象。可以通过调用 socket.socket() 方法并传递相应的参数来创建一个socket。import socket
# 创建一个socket对象默认是IPv4和TCP协议
# socket.socket(AddressFamily, Type)
s socket.socket(socket.AF_INET, socket.SOCK_STREAM)Socket对象常用方法和参数
方法/参数类型/描述示例/默认值说明socket()构造函数用于创建socket对象family参数socket.AF_INET地址族确定了socket的类型IPv4或IPv6type参数socket.SOCK_STREAM指定了socket的通信类型TCP或UDPproto参数0协议编号默认为0由系统选择合适的协议fileno参数None可以指定一个文件描述符bind(address)方法绑定地址到socketaddress参数(localhost, 12345)一个包含主机名和端口号的元组listen(backlog)方法开始监听传入连接backlog参数5定义了等待队列的大小accept()方法接受一个连接返回(conn, address)connect(address)方法用于客户端连接服务器send(bytes)方法发送数据参数为字节数据recv(bufsize)方法接收数据指定最大数据量bufsize参数1024接收数据的缓冲区大小close()方法关闭socket连接
使用示例
服务器端代码
import socket# 创建socket对象
server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址hostport
server_socket.bind((localhost, 12345))# 开始监听
server_socket.listen()print(服务器启动等待连接...)# 接受连接
connection, address server_socket.accept()
print(f连接来自 {address})# 接收数据
data connection.recv(1024)
print(f接收到的数据: {data.decode()})# 发送数据
connection.send(Hello, client!.encode())# 关闭连接
connection.close()客户端代码
import socket# 创建socket对象
client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
client_socket.connect((localhost, 12345))# 发送数据
client_socket.send(Hello, server!.encode())# 接收数据
data client_socket.recv(1024)
print(f接收到的数据: {data.decode()})# 关闭连接
client_socket.close()这仅仅是一个非常简单的例子实际应用中还需要处理错误、多线程或多进程处理多个连接、非阻塞IO等复杂情况。
TCP客户端程序开发流程 TCP网络应用程序开发分为: TCP客户端程序开发运行在服务器设备上的程序专门为客户端提供数据服务。TCP服务端程序开发运行在用户设备上的程序 TCP客户端程序开发流程 创建客户端套接字对象(买电话)和服务端套接字建立连接(打电话)发送数据(说话)接收数据(接听)关闭客户端套接字(挂电话) TCP客户端开发程序流程 创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字
import socketif __name__ __main__:# 1.创建客户端套接字对象tcp_client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.和服务端套接字建立连接tcp_client_socket.connect((localhost, 8080))# 3.发送数据tcp_client_socket.send(hello.encode(encodingutf-8))# 4.接收数据 recv阻塞等待数据的到来recv_data tcp_client_socket.recv(1024)print(recv_data.decode())# 5.关闭客户端套接字tcp_client_socket.close()
TCP服务端程序开发流程 创建服务端端套接字对象绑定IP地址和端口号设置监听等待接受客户端的连接请求接收数据发送数据关闭套接字
import socketif __name__ __main__:# 1.创建服务端套接字对象tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 绑定IP地址和端口号# bind中的参数第一个ip地址元素设置为,默认为本机ip地址tcp_server_socket.bind((, 8080))# 3.设置监听 128:代表服务端等待排队连接的最大数量tcp_server_socket.listen(128)# 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址conn_socket, ip_port tcp_server_socket.accept()print(客户端地址:, ip_port)# 5.接收数据recv_data conn_socket.recv(1024)print(接收到的数据:, recv_data.decode())# 6.发送数据conn_socket.send(客户端你的数据我收到了.encode())# 7.关闭套接字conn_socket.close()tcp_server_socket.close()TCP网络应用程序注意点
当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接TCP客户端程序一般不需要绑定端口号因为客户端是主动发起建立连接的TCP服务端程序必须绑定端口号否则客户端找不到这个TCP服务端程序。listen后的套接字是被动套接字只负责接收新的客户端的连接请求不能收发消息当TCP客户端程序和TCP服务端程序连接成功后TCP服务器端程序会产生一个新的套接字收发客户端消息使用该套接字.关闭accept返回的套接字意味着和客户端已经通信完毕 。 当客户端的套接字调用close后服务器端的recv会解阻塞,返回的数据长度为0服务端可以通过返回数据的长度来判断客户端是否已经下线反之服务端关闭套接字客户端的recv也会解阻塞返回的数据长度也为0。
socket之send和recv原理剖析
当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区这个发送和接收缓冲区指的就是内存中的一片空间。
send原理剖析
send发送数据给服务端必须得通过网卡发送数据应用程序是无法直接通过网卡发送数据的它需要调用操作系统接口也就是说应用程序把发送的数据先写入到发送缓冲区(内存中的一片空间)再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡。
recv原理剖析
recv从客户端接收数据应用软件是无法直接通过网卡接收数据的它需要调用操作系统接口由操作系统通过网卡接收数据把接收的数据写入到接收缓冲区(内存中的一片空间应用程序再从接收缓存区获取客户端发送的数据。
send和recv原理剖析图 不管是recv还是send都不是直接接收到对方的数据和发送数据到对方发送数据会写入到发送缓冲区接收数据是从接收缓冲区来读取发送数据和接收数据最终是由操作系统控制网卡来完成。
多任务版TCP服务端程序开发
实现步骤分析: 编写一个TCP服务端程序循环等待接受客户端的连接请求 while True:service_client_socket, ip_port tcp_server_socket.accept()当客户端和服务端建立连接成功创建子线程使用子线程专门处理客户端的请求防止主线程阻塞
while True:service_client_socket, ip_port tcp_server_socket.accept()sub_thread threading.Thread(targethandle_client_request, args(service_client_socket, ip_port))sub_thread.start()完整代码
import socket
import threading# 处理客户端函数
def handle_client(conn_socket):# 5.接收数据recv_data conn_socket.recv(1024)print(接收到的数据:, recv_data.decode())# 6.发送数据conn_socket.send(收到客户端数据.encode())# 7.关闭套接字conn_socket.close()# 1 使用循环接收客户端的连接请求
if __name__ __main__:# 1.创建服务端套接字对象tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口号复用让程序退出端口号立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2. 绑定IP地址和端口号# 如果bind中的参数第一个ip地址元素设置为,默认为本机ip地址tcp_server_socket.bind((, 8888))# 3.设置监听 128:代表服务端等待排队连接的最大数量tcp_server_socket.listen(128)while True:# 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址conn_socket, ip_port tcp_server_socket.accept()print(客户端地址:, ip_port)# 使用多线程去接收多个客户端的请求 设置守护主线程sub_thread threading.Thread(targethandle_client, args(conn_socket,), daemonTrue)sub_thread.start()tcp_server_socket.close()