找回密码
 会员注册
查看: 33|回复: 0

Python学习篇]PythonSocket网络编程

[复制链接]

12

主题

0

回帖

37

积分

新手上路

积分
37
发表于 2024-9-7 13:51:04 | 显示全部楼层 |阅读模式
Python中的socket编程是通过内置的socket模块实现的,可以方便地创建网络应用程序,包括客户端和服务器。服务端1.创建套接字使用socket.socket()函数创建一个TCP套接字。套接字可以是流式(TCP)或数据报式(UDP)server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)socket.AF_INET:表示使用IPv4地址。socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。2.绑定地址和端口使用bind()方法将套接字绑定到特定的IP地址和端口号上,以便客户端能够连接到该地址和端口。IP可以不指定表示本机地址。server_address=('localhost',8080) server_socket.bind(server_address)3.监听连接请求使用listen()方法开始监听客户端的连接请求。参数backlog指定等待连接的最大数量。当服务器忙于处理当前连接而不能立即处理新的连接请求时,这些新的连接请求将会被放入一个等待队列中,直到服务器有能力处理它们。backlog参数定义了这个等待队列的最大长度。server_socket.listen(5)         #最多允许5个等待连接的请求4.接受客户端连接使用accept()方法接受客户端的连接。该方法会阻塞程序,直到有客户端连接进来。一旦有连接,accept()方法返回一个新的套接字(client_socket)和客户端的地址信息(client_address)。client_socket,client_address=server_socket.accept()client_socket:是与客户端通信的新套接字。client_address:是客户端的地址信息,通常是一个元组(IP地址,端口号)。5.与客户端通信使用返回的client_socket对象与客户端进行数据交换。可以使用recv()方法接收客户端发送的数据,recv方法会阻塞直到接收到数据,并使用sendall()方法发送响应给客户端。data=client_socket.recv(1024) #接收数据,指定缓冲区大小为1024字节client_socket.sendall(data) #发送响应数据给客户端6.关闭连接当通信结束后,使用close()方法关闭客户端套接字和服务器套接字,释放资源。server_socket.close() #关闭服务器套接字TCPsocket服务器代码示例:importsocketimportthreading#服务器地址和端口SERVER_HOST='localhost'SERVER_PORT=12345defhandle_client(client_socket):try:#接收客户端的数据data=client_socket.recv(1024)print(f'收到客户端消息:{data.decode()}')#decode:把字节数据转换成字符串数据#发送响应给客户端message='Hello我是服务端!'client_socket.sendall(message.encode())#encode:把字符串数据转换成字节数据exceptExceptionase:print(f'处理客户端连接时出错:{e}')finally:#关闭客户端连接client_socket.close()defstart_server():#创建TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置端口复用选项server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)try:#绑定服务器地址和端口server_socket.bind((SERVER_HOST,SERVER_PORT))#开始监听连接server_socket.listen(128)print(f'服务器启动,监听{SERVER_HOST}:{SERVER_PORT}')whileTrue:#等待客户端连接client_socket,client_address=server_socket.accept()print(f'接受来自{client_address}的连接')#使用线程处理客户端请求client_thread=threading.Thread(target=handle_client,args=(client_socket,))client_thread.start()exceptExceptionase:print(f'服务器启动失败:{e}')finally:#关闭服务器套接字server_socket.close()if__name__=="__main__":start_server()客户端1.创建套接字使用socket.socket()函数创建一个TCP套接字。client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)socket.AF_INET:表示使用IPv4地址。socket.SOCK_STREAM:表示套接字类型为流式套接字,即TCP。2.连接到服务器使用connect()方法连接到服务器的地址和端口。server_address=('localhost',12345) #服务器地址和端口client_socket.connect(server_address)3.发送数据使用sendall()方法将数据发送到服务器。该方法确保数据被完整发送。message='我是客户端数据!'client_socket.sendall(message.encode())4.接收数据使用recv()方法从服务器接收数据,该方法会阻塞直到收到数据。参数指定接收缓冲区的大小。data=client_socket.recv(1024)print(f'收到服务器消息:{data.decode()}')5.关闭连接使用close()方法关闭套接字,释放资源。client_socket.close()TCPsocket客户端代码示例:#client.pyimportsocket#服务器地址和端口SERVER_HOST='localhost'SERVER_PORT=12345defstart_client():try:#1.创建TCP套接字client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2.连接服务器client_socket.connect((SERVER_HOST,SERVER_PORT))print(f'已连接到服务器{SERVER_HOST}:{SERVER_PORT}')#3.发送数据给服务器message='Hello我是客户端!'client_socket.sendall(message.encode())#encode:把字符串数据转换成字节数据#4.接收服务器的响应data=client_socket.recv(1024)print(f'收到服务器消息:{data.decode()}')#decode:把字节数据转换成字符串数据exceptExceptionase:print(f'客户端出错:{e}')finally:#5.关闭客户端套接字client_socket.close()if__name__=="__main__":start_client()客户端不断开,接收用户输入信息发送到服务端示例:服务端代码#server.pyimportsocketimportthreading#服务器地址和端口SERVER_HOST='localhost'SERVER_PORT=12345defhandle_client(client_socket):try:whileTrue:#接收客户端的数据data=client_socket.recv(1024)ifnotdata:breakprint(f'收到客户端消息:{data.decode()}')#发送响应给客户端message='Echo:'+data.decode()client_socket.sendall(message.encode())exceptExceptionase:print(f'处理客户端连接时出错:{e}')finally:#关闭客户端连接client_socket.close()defstart_server():#创建TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:#绑定服务器地址和端口server_socket.bind((SERVER_HOST,SERVER_PORT))#开始监听连接,请求等待队列的最大长度设置为128server_socket.listen(128)print(f'服务器启动,监听{SERVER_HOST}:{SERVER_PORT}...')whileTrue:#等待客户端连接client_socket,client_address=server_socket.accept()print(f'接受来自{client_address}的连接')#使用线程处理客户端请求client_thread=threading.Thread(target=handle_client,args=(client_socket,))client_thread.start()exceptExceptionase:print(f'服务器启动失败:{e}')finally:#关闭服务器套接字server_socket.close()if__name__=="__main__":start_server()客户端代码#client.pyimportsocket#服务器地址和端口SERVER_HOST='localhost'SERVER_PORT=12345defstart_client():try:#创建TCP套接字client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接服务器client_socket.connect((SERVER_HOST,SERVER_PORT))print(f'已连接到服务器{SERVER_HOST}:{SERVER_PORT}')whileTrue:#从用户获取输入message=input('请输入发送给服务器的消息:')#发送数据到服务器client_socket.sendall(message.encode())#接收服务器的响应data=client_socket.recv(1024)print(f'收到服务器消息:{data.decode()}')exceptExceptionase:print(f'客户端出错:{e}')finally:#关闭客户端套接字client_socket.close()if__name__=="__main__":start_client()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:13 , Processed in 0.439682 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表