Socket来源
- socket client和server的单人对话
- socket client和server的单人无限对话
- socket client和server的命令解析(socket实现ssh)
以下程序在windows和ubuntu均有测试:
socket client和server的单人对话
server部分
-
根据ip和port创建socket
-
监听(bind)
-
等待(listen)
-
接受
-
接收和发送
# * # * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn) # * @version V0.1 # * @Title: socket_server.py # * @Description: socket服务端代码 ## socket其实是tcp/ip 和udp的实现,包含着收发过程, 各种网络协议都基于socket,比如http ,mqtt等 # * @Time: 2022/2/6 21:28 # * import socket server = socket.socket() server.bind(('localhost', 6969)) ##绑定本地6969端口 print(f'我要开始打电话') server.listen() ##监听 # server.accept() ## 等待电话打进来 conn,addr = server.accept() ## 等待电话打进来 重要知识点,返回一个独立connection和独立对方地址 谁跟我打电话 我就通过connection聊天 print(f'conn = {conn} addr={addr}') print(f'电话打进来了') # data= server.recv(1024) ##不能直接调用server来接听! 要让server的小秘来接听! data= conn.recv(1024) print(f'recv {data.decode()}') conn.send(data.upper()) ## server改为conn # conn.send(b"Yes welcome to my world") ## server改为conn server.close()
client部分
- 连接端口
- 接收和发送
# *
# * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# * @version V0.1
# * @Title: ssocket_client.py
# * @Description: 建立socket客户端
# * @Time: 2022/2/6 21:25
# *
import socket
client=socket.socket()
client.connect(('localhost',6969))
# client.send("hello") ##py3必须发byte类型 否则错误
# client.send(b"hello world") ##py3必须发byte类型 否则错误 英文没有问题
client.send("我要玩游戏lol".encode("utf-8")) ##py3必须发byte类型 否则错误 中文需要encode一下
data =client.recv(1024) # 1kb数据 1024bit=1kb 1024kb=1mb
print(f' recv data = {data.decode()}')
client.close()
socket client和server的单人无限对话
加入循环判断。
server while部分
# *
# * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# * @version V0.1
# * @Title: socket_server.py
# * @Description: 可以跟1个人说上无数话 但是暂时不支持多个人 一直说话,现在只能是多个人一句话
## 因为当前不支持异步 或者并发 区分异步和并发, 异步之后 就可以让其他人接入进来 其他人必须处于排队状态!
## ubuntu20 测试通过 阻塞一人,其他人队列排队 ,异步支持多个人同时进行
# * @Time: 2022/2/6 21:28
# *
import socket
server = socket.socket()
server.bind(('localhost', 6969)) ##绑定本地6969端口
print(f'我要开始打电话')
server.listen() ##监听
# server.accept() ## 等待电话打进来
while True:
conn,addr = server.accept() ## 等待电话打进来 重要知识点,返回一个独立connection和独立对方地址 谁跟我打电话 我就通过connection聊天
print(f'conn = {conn} addr={addr}')
print(f'电话打进来了')
# data= server.recv(1024) ##不能直接调用server来接听! 要让server的小秘来接听!
while True:
data= conn.recv(1024)
print(f'recv {data.decode()}')
msg=data.decode().strip()
if(msg=="88" or msg=="bye" or msg=="byebye"):
break
if(msg==""): ## 无法发空 这边的空带边 Ctrl+C keyboard error
print("\033[1;32m Client has been lost \033[0m")
break
conn.send(data.upper()) ## server改为conn
# conn.send(b"Yes welcome to my world") ## server改为conn
server.close()
client while部分
# *
# * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# * @version V0.1
# * @Title: ssocket_client.py
# * @Description: 建立socket客户端
# * @Time: 2022/2/6 21:25
# *
import socket
client=socket.socket()
client.connect(('localhost',6969))
# client.send("hello") ##py3必须发byte类型 否则错误
# client.send(b"hello world") ##py3必须发byte类型 否则错误 英文没有问题
while True:
msg=input(">>:").strip()
if(msg==""): ## len(msg)==0
continue
client.send(msg.encode("utf-8")) ##py3必须发byte类型 否则错误 中文需要encode一下
## send出去之后 再connect,告诉一下server,否则不礼貌, server也就直接退出,不send了
if(msg=="88" or msg=="bye" or msg=="byebye"):
break
# data =client.recv(1024) # 1kb数据 1024bit=1kb 1024kb=1mb
data =client.recv(102400) # 1kb数据 1024bit=1kb 1024kb=1mb ## 加大数据传输
print(f' recv data = {data.decode()}')
client.close()
socket client和server的命令解析(ubuntu)
在ubuntu系统中,客户端发送linux命令,服务器端解释输入的命令,并返回结果,一问一答,类似卢卡和小艾、小E
socket实现的ssh服务器和客户端
Server cmd部分
# *
# * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# * @version V0.1
# * @Title: socket_server.py
# * @Description: ubuntu 20测试通过 支持 客户端返回 pwd du du -h ls "ls -lsha" 等命令+选项组合
# * @Time: 2022/2/6 21:28
# *
import socket
import os
from subprocess import Popen,PIPE
server = socket.socket()
server.bind(('localhost', 6969)) ##绑定本地6969端口
print(f'我要开始打电话')
server.listen() ##监听
# server.accept() ## 等待电话打进来
while True:
conn,addr = server.accept() ## 等待电话打进来 重要知识点,返回一个独立connection和独立对方地址 谁跟我打电话 我就通过connection聊天
print(f'conn = {conn} addr={addr}')
print(f'电话打进来了')
# data= server.recv(1024) ##不能直接调用server来接听! 要让server的小秘来接听!
while True:
data= conn.recv(1024)
print(f'recv {data.decode()}')
#msg=data.decode().strip()
msg=data.strip()
if(msg=="88" or msg=="bye" or msg=="byebye"):
break
if(msg==""):
print("\033[1;32m Client has been lost \033[0m")
break
# res = os.popen(data).read()
# https://www.jb51.net/article/200111.htm
# subprocess.Popen这个方法可以接受命令,命令可以写成一条,也可以把参数单独传递,如果参数单独传递的话,并且参数中包含反斜杠,那么很可能无法正常执行,把命令和参数写到一起传递过去 就是正常的了,当然前提是使用了shell=True
process=Popen([msg],stdout=PIPE,stderr=PIPE,shell=True)
res,stderr=process.communicate()
conn.send(res) ## server改为conn
# conn.send(b"Yes welcome to my world") ## server改为conn
server.close()
client cmd部分
# *
# * @author Zhaoliang Ye 叶昭良(zl_ye@qny.chng.com.cn)
# * @version V0.1
# * @Title: ssocket_client.py
# * @Description: command客户端
# * @Time: 2022/2/6 21:25
# *
import socket
client=socket.socket()
client.connect(('localhost',6969))
# client.send("hello") ##py3必须发byte类型 否则错误
# client.send(b"hello world") ##py3必须发byte类型 否则错误 英文没有问题
while True:
print(f'\033[1;31m please input the command, df ,top -bn 1, ls ,ls -lsha , fdisk -l等.....')
msg=input(">>:").strip()
if(msg==""):
continue
client.send(msg.encode("utf-8")) ##py3必须发byte类型 否则错误 中文需要encode一下
## send出去之后 再connect,告诉一下server,否则不礼貌, server也就直接退出,不send了
if(msg=="88" or msg=="bye" or msg=="byebye"):
break
data =client.recv(102400) # 1kb数据 1024bit=1kb 1024kb=1mb extend the data size , in order to get all the receive data at once
print(f' recv data = {data.decode()}')
client.close()
Related