zoukankan      html  css  js  c++  java
  • python socket 代码实现整理

    一.socket通讯

    1.SCOK_STREAM : TCP
    SOCK_Dgram : UDP

    family = AF_INET :服务器中间的通讯
    family = AF_INET6 :服务器中间的通讯
    family = AF_UNIX :unix不同进程间的通讯


    2.server端和client端
    server通过conn进行连接,conn都是client发去的请求通道,
    client作为发送请求的一端,使用sk进行接受发和发送

    发送的数据不能为空,空发送不过去

    server端的方法: bind(address):将address绑定到地址,在AF_INET下,以元组(ip,port)的形式表示地址
    listen(backlog):开始监听输入连接,backlog指可以挂起的最大连接数量
    accept():接受并返回(conn,address)元组,用来接受和发送数据
    可以认为接受的是客户端的sk

    recv():接受数据 #接受和传送的类型都是byte
    send():发送数据
    sendall():

    client下的方法:
    connect()
    recv():接受数据
    send():发送数据
    sendall():

    ###########################################################
    server.py
    ______________________________

    import socket

    sk = socket.socket()
    address = ('127.0.0.1',8001)

    sk.bind(address) #绑定ip,port
    sk.listen(3) #开启监听
    conn,addr= sk.accept() #开启收发消息

    inp = input("请输入要传递的信息:")
    conn.send(bytes(inp,'utf8')) #发送消息

    conn.close()

    ############################################################
    client.py

    ________________________________
    import socket

    sk = socket.socket()
    address = ('127.0.0.1',8001)
    sk.connect(address) #客户端连接ip,port

    data = sk.recv(1024) #接受消息
    print(str(data,'utf8'))

    sk.close()
    #############################################################

    二 .socket实现ssh功能


    ###########################################
    server.py
    ___________________________________________

    import socket
    import subprocess

    sk = socket.socket()
    address = ('127.0.0.1',8002)
    sk.bind(address)
    sk.listen(3)

    while True:
    conn,addr = sk.accept()
    while True:
    try:
    data = conn.recv(1024)
    except Exception:
    break

    if not data:
    break


    obj = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)
    cmd_result = obj.stdout.read()
    result_len = bytes(str(len(cmd_result)),'utf8')

    print(">>>>",result_len)
    conn.sendall(result_len)
    conn.recv(1024) #粘包现象,增加一个接收端,隔断一下。无实质作用。
    conn.sendall(cmd_result)

    sk.close()
    ##################################################
    client.py
    __________________________________________________
    import socket

    sk = socket.socket()

    address = ('127.0.0.1',8002)

    sk.connect(address)

    while True:

    inp = input("Client:")
    if inp == 'exit':
    break
    sk.send(bytes(inp,'utf8'))

    result_len = int(str(sk.recv(1024),'utf8'))
    sk.send(bytes('ok','utf8')) #粘包放松隔断数据
    data = bytes()
    while len(data) != result_len:
    recv = sk.recv(1024)
    data+=recv

    print(str(data,'gbk'))

    sk.close()
    ##################################################

    三.粘包现象
    两个send在一起的时候,就有可能粘包,解决办法就是在两个放送端之间加一个 recv

    代码(见上一个案例)

  • 相关阅读:
    Swift 编程语言新手教程
    标准差(standard deviation)和标准错误(standard error)你能解释一下?
    shell文字过滤程序(十一):paste命令
    java 获取系统变量(环境变量和环境变量)
    MD5算法原理
    受托停止事件冒泡
    搜索引擎优化要领:8条辅助技巧(三)
    几种更新(Update语句)查询的方法
    学习盲点
    2014年同年CFA考试中哪些CFA资料没有变化?
  • 原文地址:https://www.cnblogs.com/aniuzaixian/p/8043819.html
Copyright © 2011-2022 走看看