python学习之day6——socket基础

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

  • file模块是针对某个指定文件进行【打开】【读写】【关闭】
  • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】


socket服务端与客户端交流示意图:



socket()模块函数

使用socket.socket()函数来创建套接字,语法如下:

socket(socket_family,socket_type,protocol=0)

如前所述,参数一:socket_family(地址簇)

socket.AF_UNIX    只能用于单一的UNIX系统进程间通信

socket.AF_INET     IPV4(默认)

socket.AF_INET6   IPV6

参数二:socket_type(类型)

socket.SOCK_STREAM 流式socket , for TCP (默认)
socket.SOCK_DGRAM 数据报式socket , for UDP

socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

socket.SOCK_SEQPACKET 可靠的连续数据包服务

参数三:protocol(协议)

0 (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议

创建一个TCP/IP的套接字,你要这样调用socket.socket():

tcpsocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

同样的,创建一个UDP/IP的套接字,你要这样:

udpsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

套接字对象(内建)方法:

函数 描述
服务器套接字函数  
s.bind(address) 绑定地址(主机名,端口号对)到套接字
s.listen(backlog) 开始TCP监听
s.accept() 被动接受TCP客户端连接,(阻塞式)等待链接的到来
客户端套接字函数  
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数  
s.recv() 接收TCP数据
s.send() 发送TCP数据
s.sendall() 完整发送TCP数据(不停调用s.send())
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 链接到当前套接字的远端的地址(TCP连接)
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向模块的套接字函数  
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字函数  
s.fileno() 套接字的文件描述
s.makefile() 创建一个与该套接字相关联的文件对象


例:(win环境)

server端

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()
    client_data = conn.recv(1024)
    print(str(client_data,‘utf8‘))
    conn.sendall(bytes(‘不要回答,不要回答,不要回答‘,‘utf8‘))

    conn.close()

client端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.connect(ip_port)

sk.sendall(bytes(‘请求占领地球‘,‘utf8‘))

server_reply = sk.recv(1024)
print(str(server_reply,‘utf8‘))

sk.close()


连续交互通信实例:

server端:(win环境)

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()
    client_data = conn.recv(1024)
    print(str(client_data,‘utf8‘))
    conn.sendall(bytes(‘不要回答,不要回答,不要回答‘,‘utf8‘))
    while True:
        try:
            client_data = conn.recv(1024)
            print(str(client_data,‘utf8‘))
            server_response = input(‘>>>:‘).strip()

        except Exception:
            print("client closed,break")
            break
        conn.send(bytes(server_response,‘utf8‘))
    conn.close()

server端:(Linux环境)

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket

ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()
    client_data = conn.recv(1024)
    print(str(client_data,‘utf8‘))
    conn.sendall(bytes(‘不要回答,不要回答,不要回答‘,‘utf8‘))
    while True:
        client_data = conn.recv(1024)
        print(str(client_data,‘utf8‘))
        server_response = input(‘>>>:‘).strip()
if not client_data:break
        conn.send(server_response)

    conn.close()

client端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.connect(ip_port)

sk.sendall(bytes(‘请求占领地球‘,‘utf8‘))
server_reply = sk.recv(1024)
print(str(server_reply,‘utf8‘))
while True:
    user_input = input(">>>").strip()
    sk.send(bytes(user_input,‘utf8‘))
    server_reply = sk.recv(1024)
    print(str(server_reply,‘utf8‘))

sk.close()


模拟实现简单ssh功能:

server端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket
import subprocess
ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)

while True:
    print(‘server waiting...‘)
    conn,addr = sk.accept()
    while True:
        client_data = conn.recv(1024)
        if not client_data:break
        print("recv cmd:",str(client_data,‘utf8‘))
        cmd = str(client_data,‘utf8‘).strip()
        cmd_call = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
        cmd_result = cmd_call.stdout.read()
        if len(cmd_result) == 0:
            cmd_result = b"cmd execution has no output..."
        ack_msg = bytes("CMD_RESULT_SIZE|%s"%len(cmd_result),"utf8")
        conn.send(ack_msg)
        client_ack = conn.recv(50)
        if client_ack.decode() == "CLIENT_READY_TO_RECV":
            conn.send(cmd_result)

    conn.close()

client端:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = (‘127.0.0.1‘,9999)

sk = socket.socket()
sk.connect(ip_port)
while True:
    user_input = input("cmd:").strip()
    if len(user_input) == 0:continue
    if user_input == "q":break
    sk.send(bytes(user_input,‘utf8‘))
    #ack_msg = b"CMD_RESULT_SIZE|%s",len(cmd_result)
    server_ack_msg = sk.recv(100)
    cmd_res_msg = str(server_ack_msg.decode()).split("|")
    print("server response:",cmd_res_msg)
    if cmd_res_msg[0] == "CMD_RESULT_SIZE":
        cmd_res_size = int(cmd_res_msg[1])
        sk.send(b"CLIENT_READY_TO_RECV")
    res = ‘‘
    received_size = 0
    while received_size < cmd_res_size:
        data = sk.recv(500)
        received_size += len(data)
        res += str(data.decode())
    else:
        print(str(res))
        print("----------recv doen----------")
sk.close()
时间: 2024-10-06 19:35:58

python学习之day6——socket基础的相关文章

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Day3: Python学习笔记之计算机基础——网络片

Day3: Python学习笔记之计算机基础--网络片 什么是互联网协议以及为何要有互联网协议? ?互联网协议本质上是为了方便连接两台计算机而指定的一系列统一的标准. osi五层模型 计算机之间要实现数据传输必须要经过以下五层协议: ? 模型 ,协议 ,硬件 ? 应用层, http协议.用户自定义协议 ? 传输层, TCP/UPD协议 ,四层交换机.四层路由器 ? 网络层, IP协议, 三层交换机.路由器 ? 数据链路层, 以太网.电信号分组, 网桥.以太网交换机.网卡 ? 物理层, 传递电信号

Python学习一:序列基础详解

作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:[email protected] 日期:2017-11-18 Python学习一:序列基础详解 一:序列介绍 Python中一些类型的变量,就像容器一样,收纳多个数据,序列就像一个有序的队伍,像整齐的万里长城,存储着各种各样的数据,他们按照一定的秩序排列在一起,很威武,很美观,所以说序列是有序的数据集合.序列包含的一

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

Python学习之路--Socket

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定

Python学习笔记day1【基础介绍】

Alex博客:http://www.cnblogs.com/alex3714/articles/5465198.html 一.本节主要内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc文件 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求 二.具体内容 1.python介绍 python的创始人为吉多·范罗苏姆(Guid

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

python学习之路(基础篇)——python入门

一.python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的:将人的思想转换成机器能理解的语言,利用机器的优势扩大个人的能力,实现更广阔的目标. 编程语言   : 能够被计算机所理解的语言即为编程语言.编程语言是程序员与计算机沟通的介质. 编程          :编程是程序员将自己思想流程按照编程规则写下来,产出的结果就是包含一堆字符的文件. 二.程序语言分类 机器语言:直接用二进制编程,直接操作硬件 汇编语言:简写的英

PYTHON学习之路_PYTHON基础(8)

学习内容: Python模块介绍 1.经典类 or 新式类 2.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 6.socket编程初识 7.用socket实现get.put文件等功能 一.经典类 or 新式类 二.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 如果你不想在异常发生时结束你的程序,只需在try里捕获它. 语法: 以下为简单的try....exce