Socket来源

  1. socket client和server的单人对话
  2. socket client和server的单人无限对话
  3. 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
叶昭良
叶昭良
Engineer of offshore wind turbine technique research

My research interests include distributed energy, wind turbine power generation technique , Computational fluid dynamic and programmable matter.