设为首页 加入收藏

TOP

Day9 网络编程(二)
2017-09-30 17:33:11 】 浏览:11001
Tags:Day9 网络编程
, 9999)
#买手机
s = socket.socket()
#买手机卡,bind中的参数为元祖
s.bind(ip_port)
#开机
s.listen(5)
#等待电话,conn为通信链路
conn, addr = s.accept()
while True:
try:
#收消息,1024--代表字节
recv_data = conn.recv(1024)
print(str(recv_data, encoding='utf-8'))
if str(recv_data, encoding='utf-8') == 'exit':break
#发消息
send_data = recv_data.upper()
conn.send(send_data)
except Exception:
break
#挂电话
conn.close()
socket_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng


import socket
ip_port = ('127.0.0.1', 9999)
#买手机
sk = socket.socket()
#拨号
sk.connect(ip_port)
#发消息
while True:
send_data = input(">>>: ").strip()
if len(send_data) == 0:continue
sk.send(bytes(send_data, encoding='utf-8'))
if send_data == 'exit':break
#收消息
recv_data = sk.recv(1024)
print(recv_data)
#挂电话
sk.close()

发送windows命令并返回结果

socket_server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng


import socket
import subprocess
ip_port = ('127.0.0.1', 9999)
#买手机
s = socket.socket()
#买手机卡,bind中的参数为元祖
s.bind(ip_port)
#开机
s.listen(5)
#等待电话,conn为通信链路
#重复接收多个连接
while True:
conn, addr = s.accept()
while True:
try:
#收消息,1024--代表字节
recv_data = conn.recv(1024)
print(str(recv_data, encoding='utf8'))
if str(recv_data, encoding='utf8') == 'exit':break
#发消息
# 在Windows服务器获取命令
p = subprocess.Popen(str(recv_data, encoding='utf8'), shell=True, stdout=subprocess.PIPE)
res = p.stdout.read()
if len(res) == 0:
send_data = "cmd error"
else:
send_data = str(res, encoding='gbk')
print(send_data)
conn.send(bytes(send_data, encoding='utf8'))
except Exception:
break
#挂电话
conn.close()
socket_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng


import socket
ip_port = ('127.0.0.1', 9999)
#买手机
sk = socket.socket()
#拨号
sk.connect(ip_port)
#发消息
while True:
send_data = input(">>>: ").strip()
if len(send_data) == 0:continue
sk.send(bytes(send_data, encoding='utf8'))
if send_data == 'exit':break
#收消息
recv_data = sk.recv(1024)
print(str(recv_data, encoding='utf8'))
#挂电话
sk.close()

解决粘包

socket_server.py

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


import socket
import subprocess #导入执行命令模块
ip_port = ('127.0.0.1', 9999) #定义IP和端口的元组
#买手机
s = socket.socket() #绑定协议,生成套接字
#买手机卡,bind中的参数为元祖
s.bind(ip_port) #绑定IP+协议+端口,用来唯一标识一个进程,ip_port必须是元组格式
#开机
s.listen(5) #定义最大可以挂起链接数
#等待电话,conn为通信链路
#重复接收多个连接
while True: #用来重复接收新的链接
conn, addr = s.accept() #接收客户端链接请求,返回conn(相当于通信信道,addr是客户端IP+Port)
while True: #用于基于一个链接重复收发消息
try: #捕捉客户端异常关闭(ctrl+c)
#收消息,1024--代表字节
recv_data = conn.recv(1024) #收消息,阻塞
if len(recv_data) == 0:break #客户端如果退出,服务端将收到空消息,退出
if str(recv_data, encoding='utf8') == 'exit':break #客户端发送exit消息,表示退出,服务端将退出
#发消息
# 在Windows服务器获取命令,并执行命令,Windows平台标准输出是gbk编码需要转换
p = subprocess.Popen(str(recv_data, encoding='utf8'), shell=True, stdout=subprocess.PIPE)
res = p.stdout.read() #获取标准输出
if len(res) == 0: #执行错误命令,标准输出为空
send_data = "cmd error"
else:
send_data = str(res, encoding='gbk') #执行ok,字符编码转换,gbk-->str-->utf8字节
send_data = bytes(send_data, encoding='utf8')

# 解决粘包问题
#准备发送之前,先发送‘Ready|内容长度’
ready_tag = 'Ready|%s' %len(send_data)
conn.send(bytes(ready_tag, encoding='utf8'))
#得到客户端返回‘Start’表示客户端已经接收到‘Ready|内容长度’
feedback = conn.recv(1024) #Start
#接收的内容为bytes类型,需要转换为str类型
feedback = str(feedback, encoding='utf8')
if feedback.
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python面试题 —— 计算列表中出.. 下一篇利用Python进行数据分析(6) NumPy..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目