Python socket 套接字实现通信

首先:我们介绍一下socket什么是socket:
1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的接口(接收数据的),此接口接受数据之后交个操作系统
那么为什么?直接给操作系统不是更方便吗?那么你就想错了

因为操作系统的接口远比我们想象的要丑陋复杂,使用操作系统交换数据,非诚繁琐,,开发者们只能想办法让一个中间人和他们打交道,来简单的实现数据交换,那么就是socket套接字.它的作用就是:与操作系统之间数据交换将这些繁琐的操作,进行高度化封装,和简化,
2.我们能够用它实现简单的通信
在Python中有一个简单的内置socket 模块我们可以用它实现简单的基于TCP协议的通信

    #基于切换连接的循环通信
    import socket #首先我们在文件中导入socket 模块
    phone = socket.socket() #实例化一个对象
    phone.bind(('127.0.01',8765))#bind是存放ip地址的(这里存放的是本地的IP地址)
    phone.listen(5)#可以设置连接的个数,
    while 1:#循环等待连接
        conn,adds = phone.accept()
        while 1:#要循环聊天我们要重复接收发送
            try: #异常处理
                receives_commands = conn.recv(1024) #接收命令请求,最多接收1024字节当然你也可以调整
                receivse_commands = receives_commands.decode('utf-8')#网络传输是以字节的形势的所以我们要进行解码
                print(f'来自客户端的消息{receives_commands}')  #打印消息
                if receives_commands.upper(0 == 'Q':break  #正常结束
                dispatch_orders = inport('请输入:').strip().encode('utf-8')
                conn.send(dispatch_orders)
           except ConnectionResetError:#客户端异常结束
                print('客户端终端')
                break
       conn.close() #关闭连接
    phone.close#关闭服务端
    #客户端
    import socket
    phone = socket.socket()
    phone.connect(('127.0.01',8765))        #连接服务端地址
 while 1:
        dispatch_orders = inport('请输入:').strip().encode('utf-8')#发送请求
        if not dispatch_orders:print('不能为空')#不能为空
        phone.send(dispatch_orders)      #发送
        if dispatch_orders.upper() ==b'Q':#正常退出
            break
        receives_commands = phone.recv(1024)#接收服务端的回执
        receives_commands = receives_commands.decode('utf-8')#解码
        print(f'来自客户端的消息{receives_commands}')   #打印
    phone.close()#关闭客户端
                                           

那么我们就通过socket实现了一个简单的通信链接循环
其中我们需要注意的是:
1.阻塞 accept 和recv 当服务器和客户端都属于同种类阻塞时,那么谁都是同步接受或同步发送的状态那么是处于静止的,这样是不合理的(就是bug)
2.当我们设计时我们需要知道发送不能为空,不然服务端是接收不到消息的所以我们设置一个判断
有时我们会发现当我们接受的超过1024字节会发生什么?
那么下面我们就来将回答下这个问题:
下面我们引入一个操作系统的模块
Python中 subprocess 模块就是用来和cmd 命令行进行交流的模块

 obj = subprocess.Popen('dir',#实例化对象括号内第一个参数就是我们的cmd命令行的命令,这里我们写的是dir显示文件夹中内容
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,

                                   )

            print(obj.stdout.read().decode('gbk'))  # 正确命令
            print(obj.stderr.read().decode('gbk'))  # 错误命令

那么我们在这个基础上建立一个服务端响应客户端命令的机制

import socket
import subprocess
phone = socket.socket()
phone.bind(('127.0.01',8695))
phone.listen(5)
while 1:
    conn,adds = phone.accept()
    while 1:
        try:
            receives_commands = conn.recv(1024)
            if receiver_commands ==b'Q':break
            #obj = subprocess.Popen(Receiving_instructiors,
                                  # shell= True,
                          #stdout = subprocess.PIPE,
                          #stderr = subprocess.PIPE

                                   )
        obj = subprocess.Popen(receives_commands.decode('utf-8')#动态的传入命令
                          shell = True
                          stdout = subprocess.PIPE
                          stderr = subprocess.PIPE
                          )
  # print(obj.stdout.read().decode('gbk'))  # 正确命令
  # print(obj.stderr.read().decode('gbk'))  # 错误命令
        ret = obj.stodut.read()+obj.stderr.read()#将产生的内容进行拼接
        conn.send(ret)
    except ConnectionResetError:
            print('客户端终端')
            break
    conn.close()
phone.close()

import socket

phone = socket.socket()

phone.connect(('127.0.01',8695))
while 1:
    dispatch_orders = inport('请输入命令:').strip().encode('utf-8')
    if not dispatch_orders:print('输入不能为空')
    phone.send(dispatch_orders)
    if dispatch_orders.upper() ==b'Q':break
    receives_commands = phone.recv(1024)
    receives_commands = receives_commands.decode('utf-8')
    print(f'来自客户端的消息{receives_commands}')
phone.close()

那么我们就会发现一个问题,当我们输入的help命令的时候超过了1024字节那么怎么办
还发现一个问题那就是当我们输入的下个命令时,还是出来help命令的未传输完成的那部分那么就是这就是粘包了
那么是什么造成的呢?
怎样解决呢?
下个博客讲解

原文地址:https://www.cnblogs.com/wuzifan/p/11410805.html

时间: 2024-07-29 16:56:55

Python socket 套接字实现通信的相关文章

python socket 套接字编程 单进程服务器 实现多客户端访问

服务器: 1 import socket 2 #单进程服务器 实现多客户端访问 IO复用 3 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 4 #这就是apache: select模型 6 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 7 server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置端口复用 8 #AF_INET: IPV4 9

python socket 套接字编程

#!/usr/bin/python    #client   from socket import *    HOST = '127.0.0.1'  PORT = 21567  BUFSIZ = 1024  ADDR = (HOST,PORT)    tcpCliSock = socket(AF_INET, SOCK_STREAM)  tcpCliSock.connect(ADDR)  recv_s = tcpCliSock.recv(BUFSIZ)  print recv_s    try: 

Visual C++网络编程--Socket套接字编程

套接字:一种在网络中不同主机之间进行数据交换的通信桥梁,人们所使用的网络通信软件功能均是基于Socket套接字作为通信桥梁实现. 寻址方式:在Winsock中,用户可以使用TCP/IP地址家族中统一的套接字地址结构解决TCP/IP寻址中可能出现的问题,定义如下 1 struct sockaddr_in{ 2 short sin_family; //指定地址家族即地址格式 3 unsigned short sin_port; //端口号码 4 struct in_addr sin_addr; //

Python开发基础-Day23try异常处理、socket套接字基础1

异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解释器是不会进行检测的,只有在执行的过程中才能抛出的错误 异常 异常是python解释器在运行程序的过程中遇到错误所抛出的信息,如: Python异常种类: 常用异常: 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异

Python开发基础----异常处理、socket套接字基础1

异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解释器是不会进行检测的,只有在执行的过程中才能抛出的错误 异常 异常是python解释器在运行程序的过程中遇到错误所抛出的信息,如: Python异常种类: 常用异常: 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异

python基础之try异常处理、socket套接字基础part1

异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解释器是不会进行检测的,只有在执行的过程中才能抛出的错误 异常 异常是python解释器在运行程序的过程中遇到错误所抛出的信息,如: Python异常种类: 常用异常: 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异

Python网络编程—socket套接字编程(TCP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字 服务端流程 1.创建套接字 sockfd=socket.socket

python之socket(套接字)

一.客户端/服务器架构 1.1基本概念 客户端/服务器架构即:C/S架构,包括: (1)硬件C/S架构(打印机) (2)软件C/S架构(Web服务器) 1.2举例 生活中的C/S架构:饭店为S端,所有食客C端 二.TCP/udp/osi七层 2.1TCP/UDP协议 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:电子邮件.文件传输程序. UDP(U

网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

TCP协议:三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立连接的请求 3:客户端接收到服务端发来的请求,返回接成功给服务端,完成双向连接 第一客戶向服务端发送请求,请求建立连接 服务端同客户端的请求,并同时向客户端发送建立 连接的请求,最后客户端同意后建立 双向连接. C ----> S C <---- S - 反馈机制: 客户端往服务端发送请求,服务端必须返回响应, 告诉客户