python网络编程: socket服务端与客户端开发 文章目录socket服务端和客户端Socket 服务端编程创建socket对象绑定socket_server 到指定的IP和地址服务端开始监听端口接受客户端连接, 获得连接对象客户端返回连接之后, 通过 recv 方法, 接受客户端发送的消息通过conn (客户端当次连接对象), 调用send 方法可以回复消息conn (客户端当次连接对象)和socket_server对象调用close方法, 关闭连接Socket 客户端编程创建Socket 对象连接到服务端发送消息接收返回信息关闭链接socketsocket (简称 套接字) 是进程之间同通信的一个工具, 好比现实生活中的插座, 所有的家电想要工作都是基于插座进行的, 进程之间想要进行网络通信需要 socketSocket 负责进程之间的网络数据传输, 好比数据的搬运工人服务端和客户端两个进程之间通过Socket进行相互通讯, 就必须有服务端和客户端Socket服务端: 等待其他进程的连接, 可以接受发来的消息, 可以回复消息Socket客户端: 主动连接服务端, 可以发送消息, 可以接受回复Socket 服务端编程socket服务端开发主要分为以下几个步骤 :创建socket对象importsocket socket_serversocket.socket()绑定socket_server 到指定的IP和地址socket_server.bind(host,port)服务端开始监听端口socket_server.listen(backlog)这里的backlog 为 int 整数, 表示允许的连接数量, 超出会等待, 可以不填, 不填会自动设置一个合理值接受客户端连接, 获得连接对象conn,addresssocket_server.accept()print(f接收到客户端连接, 来自:{address})accept()方法是阻塞方法, 如果没有连接, 会卡在当前这一行不向下执行accept 放回的是一个二元元组, 可以使用上述形式, 用两个变量接收二元元组 2 个元素客户端返回连接之后, 通过 recv 方法, 接受客户端发送的消息whileTrue:dataconn.recv(1024).decode(utf-8)ifdataexit:breakprint(接收到发送来的数据: ,data)recv 方法的返回值是字节数组, 可以通过 decode 使用 UTF-8 解码为字符串recv 方法的传参是 buffsize, 缓冲区大小, 一般设置为 1024可以通过 while True 无限循环来持续和客户端进行数据交互可以通过判定客户端发来的特殊标记, 如 exit , 来退出循环通过conn (客户端当次连接对象), 调用send 方法可以回复消息conn.send(返回的消息.encode(utf-8))conn (客户端当次连接对象)和socket_server对象调用close方法, 关闭连接conn.close()完整代码如下:importsocket# 创建socket对象socket_serversocket.socket()# 绑定I地址和P端口socket.server.bind((localhost,8888))# 监听端口socket_server.listen(1)# 表示允许的连接数量# 等待客户端连接# result: tuple socket_server.accept()# conn result[0] # 客户端与服务端的连接对象# address result[1] # 客户端的地址信息# 等价于:conn,addresssocket_server.accept()# accept 返回的是一个二元元组 (连接对象, 地址信息)# accept 是一个阻塞方法, 如果没有连接, 就不会向下执行print(f接受到信息来自:{address})whileTrue:# 接受客户信息, 要使用客户端与服务端的本次连接对象, 而不是 socket_server对象data:strconn.recv().decode(utf-8)# recv 接收参数缓冲区大小, 一般给 1024# 返回的是一个字节数组, bytes 对象, 不是字符串, 可以通过encode方法通过utf-8编码,将字节数组转换为字符串对象print(接收到的信息: ,data)# 输入回复消息msginput().encode(utf-8)# 设置结束标志ifmsgexit:break# 发送回复消息conn.send(msg)# 关闭连接conn.close()# 关闭客户端的通讯连接socket_server.close()Socket 客户端编程socket 客户端编程主要分为以下几个步骤:创建Socket 对象importsocket socket_clientsocket.socket()连接到服务端socket_client.connect((localhost,8888))发送消息whileTrue:send_msginput(请输入要发送的消息: )# 设置停止标志ifsend_msgexit:breaksocket_client.send(send_msg.encode(utf-8))发送和传输的信息都是以字节数组的形式传输的, 以 UTF-8 编码即可接收返回信息recv_msgsocket_client.recv(1024)print(recv_msg.decode(utf-8))recv 是阻塞式的, 即接收不到返回, 就卡在这里等待接收的信息需要通过 UTF-8 编码为字符串关闭链接socket_client.close()具体代码如下:importsocket socket_clientsocket.socket()socket_client.connect((localhost,8888))whileTrue:send_msginput(请输入要发送的消息: )# 设置停止标志ifsend_msgexit:breaksocket_client.send(send_msg.encode(utf-8))recv_msgsocket_client.recv(1024)# recv 是阻塞式的, 即接收不到返回, 就卡在这里等待print(recv_msg.decode(utf-8))# 接收的信息需要通过 UTF-8 编码为字符串# 关闭链接socket_client.close()