python socket通信框架_python模块——socket (实现简单的C/S架构端通信操作CMD)

# 服务端代码

#!/usr/bin/env python#-*- coding:utf-8 -*-

__author__ = "loki"

importsocketimportsubprocess

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

server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

ip_port= ('127.0.0.1', 8011)

server.bind(ip_port)

server.listen(5)#链接循环

while 1:print('Waiting...')

conn, addr=server.accept()print('-->conn:', conn)print('-->addr:', addr)print('Got it...')while 1:try:

cmd= conn.recv(1024)

res= subprocess.Popen(cmd.decode('utf-8'),

shell=True,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

conn.send(res.stdout.read())

conn.send(res.stderr.read())exceptException:breakconn.close()#server.close()

客户端

#!/usr/bin/env python#-*- coding:utf-8 -*-

__author__ = "loki"

importsocket

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

ip_port= ('127.0.0.1', 8011)

client.connect(ip_port)#通信循环

while 1:#发消息

cmd = input('>>:').strip()if notcmd:continueclient.send(bytes(cmd, encoding='utf-8'))#收消息

data = client.recv(8196)print(data.decode('gbk'))#client.close()

以上代码是基于TCP 流的方式进行C/S控制,注意编码Linux适用于utf-8,Windows适用于gbk

已知BUG:

1.在接受的信息大于8196(或者你自己定义的值的时候)可能会出现粘包问题

2.执行可执行程序或者需要交互的cmd命令,client会宕住,需要重新开客户端

3.如果是作为纯py脚本使用还需要进行sys.platform的系统判断,如果是win采用编码gbk,linux采用编码utf-8

4.以上代码仅供学习参考使用

# 解决粘包问题的TCP版本 —— server

#!/usr/bin/env python#-*- coding:utf-8 -*-

__author__ = "loki"

importsocketimportsubprocessimportstruct

user_input= input('Please input server_ip:').strip()

ip_port= ('%s' % user_input, 9991)

buff_size= 1024stick_pack_server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

stick_pack_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

stick_pack_server.bind(ip_port)

stick_pack_server.listen(5)while 1:print('Waiting...')

msg, address=stick_pack_server.accept()print("msg-->:", msg)print("addr-->:", address)while 1:try:

cmd=msg.recv(buff_size)if notmsg:breakres= subprocess.Popen(cmd.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,

stdin=subprocess.PIPE)

stderr=res.stderr.read()

stdout=res.stdout.read()

data_size= len(stderr) +len(stdout)#send header

msg.send(struct.pack("i", data_size))#send real data

msg.send(stderr)

msg.send(stdout)exceptException as e:print('---->', e)breakmsg.close()#phone.close()

# 解决粘包问题的TCP版本 —— client

#!/usr/bin/env python#-*- coding:utf-8 -*-

__author__ = "loki"

importsocketimportstruct

user_input= input("Please input client_ip:").strip()

ip_port= ('%s' % user_input, 9991)

buff_size= 1024stick_pack_client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

stick_pack_client.connect(ip_port)while 1:#send message

cmd = input('>>:').strip()if notcmd:continuestick_pack_client.send(cmd.encode("utf-8"))#receive header

baotou = stick_pack_client.recv(4)

data_size= struct.unpack("i", baotou)[0]#receive data

receive_size =0

receive_data= b''

while receive_size

data= stick_pack_client.recv(1024)

receive_size+=len(data)

receive_data+=dataprint(receive_data.decode("gbk"))#stick_pack_client.close()

Wrap-up

1.注意tcp客户端需要使用 xx.connect()

2.注意tcp服务端发送消息是使用的accept,以及发送消息使用的是conn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Python Socket 实现 FTP 客户和服务器的基本流程: FTP 服务器: 1. 导入 socket 模块和 os 模块。 2. 创建一个 TCP Socket 对象,并绑定到一个 IP 地址和口号上。 3. 调用 socket 对象的 listen() 方法,开始监听客户连接请求。 4. 服务器通过无限循环不断接受客户连接请求。当有客户连接请求时,服务器通过 accept() 方法接受客户的连接请求,并返回一个新的 socket 对象和客户的地址。 5. 服务器收到客户的请求后,根据请求的类型进行相应的处理,比如上传文件、下载文件、获取文件列表等。 6. 服务器处理完客户的请求后,通过 send() 方法向客户发送响应数据。 FTP 客户: 1. 导入 socket 模块和 os 模块。 2. 创建一个 TCP Socket 对象,并连接到 FTP 服务器的 IP 地址和口号上。 3. 客户向服务器发送请求数据,比如上传文件、下载文件、获取文件列表等。 4. 客户通过 recv() 方法接收服务器的响应数据。 5. 客户处理服务器返回的响应数据,比如显示文件列表、保存下载的文件等。 下面是一个简单的 FTP 服务器和客户的示例代码: FTP 服务器代码: ``` import socket import os # 设置服务器IP地址和口号 HOST = '127.0.0.1' PORT = 8888 # 创建TCP Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和口号 server_socket.bind((HOST, PORT)) # 开始监听客户连接请求 server_socket.listen(5) print('FTP server is running...') while True: # 接受客户连接请求 client_socket, client_address = server_socket.accept() print('Connected by', client_address) # 接受客户请求数据 request_data = client_socket.recv(1024).decode('utf-8') # 处理客户请求 if request_data.startswith('get'): # 获取文件名 filename = request_data.split()[1] # 判断文件是否存在 if os.path.exists(filename): # 打开文件并读取文件内容 with open(filename, 'rb') as f: file_data = f.read() # 向客户发送文件数据 client_socket.sendall(file_data) print('File sent successfully!') else: # 如果文件不存在,向客户发送错误信息 error_msg = 'File not found!' client_socket.sendall(error_msg.encode('utf-8')) print(error_msg) elif request_data.startswith('put'): # 获取文件名 filename = request_data.split()[1] # 接收客户发送的文件数据 file_data = client_socket.recv(1024) # 保存文件到服务器本地 with open(filename, 'wb') as f: f.write(file_data) print('File received successfully!') elif request_data == 'list': # 获取文件列表 file_list = os.listdir() # 将文件列表转换为字符串 file_list_str = '\n'.join(file_list) # 向客户发送文件列表 client_socket.sendall(file_list_str.encode('utf-8')) print('File list sent successfully!') # 关闭客户连接 client_socket.close() # 关闭服务器Socket连接 server_socket.close() ``` FTP 客户代码: ``` import socket import os # 设置服务器IP地址和口号 HOST = '127.0.0.1' PORT = 8888 # 创建TCP Socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器 client_socket.connect((HOST, PORT)) while True: # 获取用户输入的命令 cmd = input('ftp> ') # 发送命令到服务器 client_socket.sendall(cmd.encode('utf-8')) # 处理服务器响应 if cmd.startswith('get'): # 获取文件名 filename = cmd.split()[1] # 从服务器接收文件数据 file_data = client_socket.recv(1024) # 判断文件是否存在 if file_data.decode('utf-8') == 'File not found!': print('File not found!') else: # 保存文件到本地 with open(filename, 'wb') as f: f.write(file_data) print('File received successfully!') elif cmd.startswith('put'): # 获取文件名 filename = cmd.split()[1] # 判断文件是否存在 if os.path.exists(filename): # 打开文件并读取文件内容 with open(filename, 'rb') as f: file_data = f.read() # 向服务器发送文件数据 client_socket.sendall(file_data) print('File sent successfully!') else: # 如果文件不存在,向服务器发送错误信息 error_msg = 'File not found!' client_socket.sendall(error_msg.encode('utf-8')) print(error_msg) elif cmd == 'list': # 从服务器接收文件列表 file_list_data = client_socket.recv(1024) # 将文件列表转换为字符串 file_list_str = file_list_data.decode('utf-8') # 打印文件列表 print(file_list_str) # 关闭客户Socket连接 client_socket.close() ``` 注意:以上代码仅供参考,需要根据具体情况进行修改和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值