socket 套接字

socket套接字

​ socket是处于应用层与传输层之间的抽象层, 他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后交由操作系统

​ 为什么存在socket抽象层?

​ 如果直接与操作系统数据交互非常麻烦, 繁琐, socket对这些繁琐的操作高度的封装, 简化

​ socket在python中就是一个模块

基于TCP协议的socket简单通信

客户端(cliend)

import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 默认基于TCP协议的socket
phone.connect(("127.0.0.1", 8848))
data = input("请输入")
phone.send(date.encode("utf-8"))
from_server_data = phone.recv(1024)
print(f"来自服务端的消息:{from_server_data.decode('utf-8')}")
phone.close()

服务端(server)

import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 默认基于TCP协议的socket
phone.bind(("192.168.14.198", 8848))
phone.listen(5)
print(111)
conn,addr = phone.accept() # 阻塞
print(conn, addr)
from_client_data = conn.recv(1024)
print(f"来自客户端{addr[0]的消息:{from_client_data.decode("utf-8")}")
to_client_data = input(">>>")
conn.send(to_client_data.encode("utf-8"))
conn.close()
phone.close()

基于TCP协议的socket 链接+循环 通信

server(服务器端)
import socket
phone = socket.socket()
phone.bind(("172.0.0.1", 8848))
phone.listen()
while 1:
    conn, addr = phone.accept()
    print(conn, addr)
    while 1:
        from_client_data = conn.recv(1024)
        print(f"客户端传输进来的信息:{from_client_data.strip().decode('utf-8')}")
        to_client_data = input("传给客户端的信息:")
        conn.send(to_client_data)
    except ConnectionResetError:
        print("客户端中断")
        break
    conn.close()
phone.close()
client(客户端)
import socket
phone = socket.socket()
phone.connect(("127.0.0.1", 8848))
while 1:
    data = input("传向服务器端的信息:").strip().encode("utf-8")
    if not data:
        print("输入不得为空,会双向阻塞出bug")
        continue
    phone.send(data)
    if data.upper() == b"Q":
        print("退出成功")
        break
    from_server_data = phone.recv(1024)
    print(f"服务端传输进来的信息{from_server_data.strip().decode('utf-8')}")
phone.close()

基于TCP协议的socket通信 实例: 远程执行命令

server(服务器端)
import socket
import subprocess
phone = socket.socket()
phone.bind(("172.0.0.1", 8848))
phone.listen()
while 1:
    conn, addr = phone.accept()
    print(conn, addr)
    while 1:
        from_client_data = conn.recv(1024)
        # print(f"客户端传输进来的信息:{from_client_data.strip().decode('utf-8')}")
        obj = subprocess.Popen(from_client_data.decode('utf-8'),
                 shell=True,
                 stdout=subprocess.PIPE.
                 stderr=subprocess.PIPE)
        to_client_data = obj.stdout.read() + obj.stderr.read()
        conn.send(to_client_data)
    except ConnectionResetError:
        print("客户端中断")
        break
    conn.close()
phone.close()
client(客户端)
import socket
phone = socket.socket()
phone.connect(("127.0.0.1", 8848))
while 1:
    data = input("传向服务器端的信息:").strip().encode("utf-8")
    if not data:
        print("输入不得为空,会双向阻塞出bug")
        continue
    phone.send(data)
    if data.upper() == b"Q":
        print("退出成功")
        break
    from_server_data = phone.recv(1024)
    print(f"服务端传输进来的信息{from_server_data.strip().decode('gbk')}")
phone.close()

转载于:https://www.cnblogs.com/beichen123/p/11366208.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值