目录python
不须要联网shell
客户端直接和服务端交互编程
客户端嫁接在浏览器上,浏览器和服务端交互浏览器
硬件,传输电信号网络
对电信号分组架构
以太网头:head并发
发送地址(mac地址):ssh
接收地址(mac地址):socket
数据类型:tcp
data
mac地址能够肯定惟一的计算机
对电信号分组
head
以太网头:
发送地址(ip地址):
接收地址(ip地址):
data
互联网就是多个局域网,局域网经过路由器链接
ip地址+mac地址找到全世界独一无二的计算机
找到一个应用程序,每个应用程序都会有一个独一无二的端口
ip地址+mac地址+端口找到全世界独一无二的计算机的惟一的应用程序
数据交互
应用程和传输层之间,你就是写了一个应用程序,服务端和客户端就是一个应用程序
而后服务端还有可能会有遗留的数据返回给客户端,会在这个时候发完
若是客户端没有接收到这条请求,就没有第四条请求给服务端,服务端会隔一段时间再发一次带有FIN和ACK的请求给客户端...若是在2MSL时间内,客户端一直没有响应,则强行关闭
import socket # 1. 符合TCP协议的手机 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP # 2. 绑定手机号 110 server.bind(('127.0.0.1', 8000)) # 127.0.0.1表明本地 # server.bind(('192.168.11.210',8000)) # 127.0.0.1表明本地 server.listen(5) # 半链接池 # 3. 等待客户端链接 print('start...') # 连接循环 while True: # 通讯循环 conn, client_addr = server.accept() while True: try: # 4. 收到消息receive data = conn.recv(1024) print(data) # 5. 回消息 conn.send(data.upper()) except ConnectionAbortedError: continue except ConnectionResetError: break
import socket # 1. 建立符合TCp协议的手机 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 拨号 client.connect(('127.0.0.1',8000)) while True: msg = input('please enter your msg') # dir # 3. 发送消息 client.send(msg.encode('utf8')) # 4. 接收消息 data = client.recv(1024) print(data)
在客户端处模拟ssh发送指令,服务端经过subprocess执行该命令,而后返回命令的结果
import socket import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('192.168.11.210', 8000)) server.listen(5) print('start...') while True: conn, client_addr = server.accept() print(client_addr) while True: try: cmd = conn.recv(1024) # dir print(cmd) # 帮你执行cmd命令,而后把执行结果保存到管道里 pipeline = subprocess.Popen(cmd.decode('utf8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) stderr = pipeline.stderr.read() stdout = pipeline.stdout.read() conn.send(stderr) conn.send(stdout) except ConnectionResetError: break
import socket # 1. 建立符合TCp协议的手机 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 拨号 client.connect(('192.168.11.210',8000)) while True: msg = input('please enter your msg') # dir # 3. 发送消息 client.send(msg.encode('utf8')) # 4. 接收消息 data = client.recv(10) print(data.decode('gbk'))
import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8000)) print('start...') while True: data, client_addr = server.recvfrom(1024) print(client_addr) print(data) server.sendto(data.upper(), client_addr)
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = input('please enter your msg:') client.sendto(msg.encode('utf8'), ('127.0.0.1', 8000)) data = client.recvfrom(1024) print(data)
# 同一时刻有多我的在接听 import socketserver import subprocess import struct class MyHandler(socketserver.BaseRequestHandler): # 通讯循环 def handle(self): while True: try: cmd = self.request.recv(1024) print(cmd) pipeline = subprocess.Popen(cmd.decode('utf8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) stdout = pipeline.stdout.read() stderr = pipeline.stderr.read() count_len = len(stdout) + len(stderr) guding_bytes = struct.pack('i', count_len) self.request.send(guding_bytes) # 4 self.request.send(stderr + stdout) except ConnectionResetError: break # 使用socketserver的链接循环(并发),可是使用了本身的通讯循环 # myhandler = MyHandler() if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1', 8000), MyHandler, bind_and_activate=True) print('start...') server.serve_forever()