zoukankan      html  css  js  c++  java
  • python之socket

    什么是socket

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
    Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
    在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
    Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

    上面的一段话是网络上摘抄的,对于房间和多孔插座的比喻还是比较形象的。也可能简单理解为 “socket是通信双方通过网络进行数据交互的桥梁,socket只负责建立连接和数据传递”

    先上张度娘上的百科原理图

    接着进入正题,上例子,举例是快速入门最好的方法之一

    以下是TCP连接的例子

    [root@localhost _forpy]# cat sock_server.py
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import socket
    
    #服务端先建立socket通道
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定主机及端口(即指定具体服务提供的地方)
    ip_port = ('192.168.1.8',8008)
    sock.bind(ip_port)
    #开始监听,设置客户端最大等待连接数
    sock.listen(8)
    
    while True:
        #accept 阻塞并等待客户端连接,并获取客户端sock对象conn及地址
        print "waiting for connection of client.."
        conn,addr = sock.accept()
        print conn,addr
        #recv 阻塞并等待,直接接收到client数据
        recv = conn.recv(1024)
        print "recevice message",recv
        #发送数据回应
        conn.send("I'm copy the message: %s" %recv)
        #关闭client socket连接通道
        conn.close()
    [root@localhost _forpy]# 
    [root@localhost _forpy]# cat sock_client.py
    #!/usr/bin/env python
    #!-*- coding:utf-8 -*-
    import socket
    
    #创建客户端socket对象
    conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #连接服务端
    conn.connect(('192.168.1.8',8008))
    #客户端发送消息数据
    conn.send("The message is send by client..")
    #从服务端接收消息数据
    server_back_message = conn.recv(1024)
    print "receive message from server:",server_back_message
    #关闭与server端的socket连接通道
    conn.close()
    
    ##启动服务端
    [root@localhost _forpy]# sock_server.py
    waiting for connection of client..
    <socket._socketobject object at 0x7f248d671670> ('192.168.1.8', 57120)
    recevice message The message is send by client..
    waiting for connection of client..
    
    ##启动客户端
    [root@localhost _forpy]# sock_client.py
    receive message from server: I'm copy the message: The message is send by client..

    以下是UDP连接的例子

    [root@localhost _forpy]# cat sock_udp_server.py
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import socket
    ip_port = ('192.168.1.8',8009)
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    sock.bind(ip_port)
    
    print "start udp socket server...waiting for message of client!!"
    while True:
            data = sock.recv(1024)
            print data
    [root@localhost _forpy]# cat sock_udp_client.py
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import socket
    ip_port = ('192.168.1.8',8009)
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
    while True:
        inp = raw_input("message: ").strip()
        if inp == 'exit':
            break
        sock.sendto(inp,ip_port)
    sock.close()
    
    #启动服务端
    [root@localhost _forpy]# sock_udp_server.py
    start udp socket server...waiting for message of client!!
    hi,girl....         #第2步:这里是收到第1步客户端发过来的数据
    merry christmas..   #第4步:这里是收到第3点客户端发过来的数据
    
    #启动客户端
    [root@localhost _forpy]# sock_udp_client.py
    message: hi,girl....       #第1步:输入hi,girl...,服务端收到后打印,见第2步数据
    message: merry christmas.. #第3步:继续输入merry christmas..,服务端收到后打印,见第4步数据
    message: 

    socket对象创建参数详解

    sock = socket.socket(参数一,参数二,参数三)
    
    例子
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
    
    参数一:地址簇
      socket.AF_INET IPv4(默认)
      socket.AF_INET6 IPv6
      socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
    
    参数二:类型
      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 可靠的连续数据包服务
    
    参数三:协议
      0  (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议

    socket对象常用方法详解

    sk.bind(address)
        s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。
    
    sk.listen(backlog)
        开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
        backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
        这个值不能无限大,因为要在内核中维护连接队列
    
    sk.setblocking(bool)
      是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
    
    sk.accept()
      接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
      接收TCP 客户的连接(阻塞式)等待连接的到来
    
    sk.connect(address)
      连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
    
    sk.connect_ex(address)
      同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061
    
    sk.close()
      关闭套接字
    
    sk.recv(bufsize[,flag])
      接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
    
    sk.recvfrom(bufsize[.flag])
      与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
    
    sk.send(string[,flag])
      将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
    
    sk.sendall(string[,flag])
      将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
    
    sk.sendto(string[,flag],address)
      将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。
    
    sk.settimeout(timeout)
      设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )
    
    sk.getpeername()
      返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
    
    sk.getsockname()
      返回套接字自己的地址。通常是一个元组(ipaddr,port)
    
    sk.fileno()
      套接字的文件描述符

    参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html

  • 相关阅读:
    Serialize and Deserialize Binary Tree
    sliding window substring problem汇总贴
    10. Regular Expression Matching
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接
    程序员如何写一份合格的简历?(附简历模版)
    9个提高代码运行效率的小技巧你知道几个?
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构
    24张图7000字详解计算机中的高速缓存
    《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第五章 优化程序性能
  • 原文地址:https://www.cnblogs.com/benric/p/5073447.html
Copyright © 2011-2022 走看看