一 socket (套接字)

  1. socket处于应用层与传输层之间,提供了一些简单的接口,避免与操作系统之间的对接,省去了相当繁琐复杂的操作.
  2. socket在python中属于一个模块,通过调用模块中已经实现的方法建立两个进程之间的连接和通信。

1.1 基于TCP协议的socket通信

服务器端:

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8848))
phone.listen()
print('开机')
while 1:
    conn,addr = phone.accept()
    while 1:
        try:
            from_client_data = conn.recv(1024).decode("utf-8")
            if from_client_data.upper() == "Q":
                print('客户端已正常断开连接')
                break
            else:
                print(f'来自客户端的消息:{from_client_data}')
                while 1:
                    to_client_data = input('>>>')
                    if not to_client_data:
                        print('内容不能为空!')
                        continue
                    else:
                        conn.send(to_client_data.encode('utf-8'))
                        break
        except ConnectionResetError:
            print('客户端异常断开连接')
            break
    conn.close()
phone.close()

客户端:

import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8848))
while 1:
    try:
        data = input('>>>')
        if not data:
            print('内容不能为空!')
            continue
        phone.send(data.encode('utf-8'))
        if data.upper() == "Q":
            break
        else:
            from_server_data = phone.recv(1024).decode('utf-8')
            print(f'来自服务器的消息:{from_server_data}')
    except ConnectionResetError:
        print('服务器异常断开连接')
        break
phone.close()

实例: 远程执行命令

调用subprocess模块

import subprocess

obj = subprocess.Popen('dir1',
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE,
                       )
print(obj.stdout.read().decode('gbk'))  # 正确命令
print(obj.stderr.read().decode('gbk'))  # 错误命令

1.2 socket缓存区

为什么会存在缓存区:

  1. 暂时存储一些数据
  2. 在网络波动时,保证数据的收发稳定,匀速
  3. 缺点: 造成了粘包现象之一
12-28 09:06