Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
1. 操作系统的缓冲区
缓存区
1.为什么存在缓冲区?
暂时存储一些数据.
缓冲区存在如果网络波动,保证数据的收发稳定,匀速.
2.缺点: 造成了粘包现象之一.
2. 基于TCP协议的socket循环通信
服务端(server)
import socket server = socket.socket()
server.bind(('127.0.0.1',8848))
server.listen()
# listen: 允许5个人链接我,剩下的链接也可以链接,等待. conn,addr = server.accept() # 等待客户端连接,阻塞状态中
print(f'链接来了: {conn,addr}') while 1:
try:
# 等待接收客户端消息
from_client_data = conn.recv(1024) # 最多接受1024字节
# 客户端输入Q表示客户端正常退出
if from_client_data.upper() == b'Q':
print('客户端正常退出聊天了')
break
# 打印客户端的IP以及发送过来的消息
print(f'来自客户端{addr}消息:{from_client_data.decode("utf-8")}')
# 给客户端返回消息
to_client_data = input('>>>').strip().encode('utf-8')
conn.send(to_client_data)
except ConnectionResetError:
print('客户端链接中断了')
break
conn.close()
server.close()
客户端(client)
import socket client = socket.socket()
client.connect(('127.0.0.1',8848)) while 1:
to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') # 服务端如果接受到了空的内容,服务端就会一直阻塞中,所以无论哪一端发送内容时,都不能为空发送
if not to_server_data:
print('发送内容不能为空')
continue
client.send(to_server_data) # 输入Q表示客户端正常退出
if to_server_data.upper() == b'Q':
break # 接收服务端返回的消息
from_server_data = client.recv(1024) # 最多接受1024字节
print(f'来自服务端消息:{from_server_data.decode("utf-8")}') client.close()
3. 基于TCP协议的socket链接+循环 通信
服务端(server)
import socket server = socket.socket()
server.bind(('127.0.0.1',8848)) # 必须是元组
server.listen(2) while 1:
conn,addr = server.accept() # 等待客户端连接,阻塞状态中
print(f'链接来了: {conn,addr}') while 1:
try:
from_client_data = conn.recv(1024) # 最多接受1024字节 if from_client_data.upper() == b'Q':
print('客户端正常退出聊天了')
break print(f'来自客户端{addr}消息:{from_client_data.decode("utf-8")}')
to_client_data = input('>>>').strip().encode('utf-8')
conn.send(to_client_data)
except ConnectionResetError:
print('客户端链接中断了')
break
conn.close()
server.close()客户端(client)
import socket client = socket.socket()
client.connect(('127.0.0.1',8848)) while 1:
to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') if not to_server_data:
print('发送内容不能为空')
continue
client.send(to_server_data)
if to_server_data.upper() == b'Q':
break
from_server_data = client.recv(1024) # 最多接受1024字节
print(f'来自服务端消息:{from_server_data.decode("utf-8")}') client.close()
4. 基于TCP协议的socket应用实例:执行远程命令
服务端(server)
import socket
import subprocess server = socket.socket()
server.bind(('127.0.0.1',8848))
server.listen(2) while 1:
conn,addr = server.accept() # 等待客户端链接我,阻塞状态中
print(f'链接来了: {conn,addr}') while 1:
try:
from_client_data = conn.recv(1024) # 最多接受1024字节 if from_client_data.upper() == b'Q':
print('客户端正常退出聊天了')
break # 执行远程命令
obj = subprocess.Popen(from_client_data.decode('utf-8'),
shell=True,
# 执行正确指令的管道
stdout=subprocess.PIPE,
# 执行错误指令的管道
stderr=subprocess.PIPE, )
# 将正确指令以及错误指令得到的结果返回给客户端
result = obj.stdout.read() + obj.stderr.read()
conn.send(result)
except ConnectionResetError:
print('客户端链接中断了')
break
conn.close()
server.close() # shell: 命令解释器,相当于调用cmd 执行指定的命令。
# stdout:正确结果丢到管道中。
# stderr:错了丢到另一个管道中。
# windows操作系统的默认编码是gbk编码。
客户端(client)
import socket client = socket.socket()
client.connect(('127.0.0.1',8848)) while 1:
to_server_data = input('>>>输入q或者Q退出').strip().encode('utf-8') if not to_server_data:
print('发送内容不能为空')
continue
client.send(to_server_data)
if to_server_data.upper() == b'Q':
break
from_server_data = client.recv(1024) # 最多接受1024字节
print(f'{from_server_data.decode("gbk")}') client.close()
5. socketserver通信
server服务端
import socketserver class Myserver(socketserver.BaseRequestHandler):
def handle(self):
while 1:
from_client_msg = self.request.recv(1024).decode('utf-8')
print(f'来自客户端{self.client_address}的消息:',from_client_msg)
to_client_msg = input('>>>')
self.request.send(to_client_msg.encode('utf-8')) if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),Myserver)
server.serve_forever()
client客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8888))
while 1:
to_server_msg = input('>>>').encode('utf-8')
client.send(to_server_msg)
from_server_msg = client.recv(1024)
print('来自服务端的消息:',from_server_msg.decode('utf-8'))
client.close()
Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信的更多相关文章
- Python网络编程基础 ❸ struct模块 基于upd的socket服务
struct模块 基于upd的socket服务
- (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...
- (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型
1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...
- 【TCP/IP网络编程】:04基于TCP的服务器端/客户端
摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...
- unix网络编程第四章----基于TCP套接字编程
为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...
- python网络编程【二】(使用TCP)
1.建立socket 对于一个客户端程序来说,建立一个socket需要两个步骤.首先,您需要建立一个实际的socket对象.其次,您需要把它连接到远程服务器上. 在建立socket对象的时候,您需要告 ...
- 网络编程[第三篇]基于tcp协议实现远程连接
需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...
- Python进阶(1)_Socket网络编程(基于tcp的socket)
网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
随机推荐
- 论logstash的玩法(ELK)
本篇文章采用的采用的是logstash-7.7.0版本,主要从如下几个方面介绍 1.logstash是什么,可以用来干啥 2.logstash的基本原理是什么 3.怎么去玩这个elk的组件logsta ...
- python3.6 + django2.0.6 + xadmin0.6
django2.0集成xadmin0.6报错集锦 http://www.lybbn.cn/data/bbsdatas.php?lybbs=50 1.django2.0把from django.core ...
- [ C++ ] 勿在浮沙筑高台 —— 内存管理(9~16p)primitives(下)
per-class allocator 2 tips: operator new重载 不会被派生类实际使用,因为父类大小内存的分配交给子类去调用明显是不正确的.实际上会被转交至 : : operato ...
- JavaWeb网上图书商城完整项目--day03-1.图书模块功能介绍及相关类创建
1 前两天我们学习了user用户模块和图书的分类模块,接下来我们学习图书模块 图书模块的功能主要是下面的功能: 2 接下来我们创建对应的包 我们来看看对应的数据库表t_book CREATE TABL ...
- 搜索引擎-SHODAN
shodan这个搜索引擎不会爬取网页内容,而是爬取所有的联网设备. 这个搜索引擎还是很强大的,下图就是我用shodan查自己的案例服务器的结果: 如图,可以查到这台服务器安装了wdcp管理面板,黑客完 ...
- .NET Core请求控制器Action方法正确匹配,但为何404?
前言 有些时候我们会发现方法名称都正确匹配,但就是找不到对应请求接口,所以本文我们来深入了解下何时会出现接口请求404的情况. 匹配控制器Action方法(404) 首先我们创建一个web api应用 ...
- JavaScript基础-自己定义自己的函数(016)
把一个函数对象赋值给变量后,就可以通过这个变量再次定义函数,甚至可以在一个函数内部再次定义它自己: var scareMe = function () { alert("Boo!" ...
- 洛谷 P1991 【无线通讯网】
这道题找到关键点那就是模板题了,代码好写哒~ 因为有S个电话,两个电话就可以连通两个块,那是不是我们就可以看做一条无消耗的边,提前连了起来.根据Kruskal的思想,我们每次加入最小的边,直到联通,由 ...
- SpringBoot + MyBatis + MySQL 读写分离实战
1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依靠 ...
- Mac上使用Docker Desktop启动Kubernetes,踩坑后终于搞掂
1 前言 Kubernetes又简称k8s,是Google开源的容器集群管理系统,最近也是火热.闲来无事(为了发文),捣鼓了一下,在Mac上搭建Kubernetes,遇到一些坑,也记录一下. 另外,D ...