Python2.7 socket

linux网络编程中,第一步接触的就是socket,对socket不了解的可自行学习<<UNIX环境高级编程>>,本文只是熟悉python的socket模块用法,相信如果看过高级编程再看python的socket模块,会感觉十分容易的。

在socket模块中定义了以下几个异常:

    socket.error  系统调用出错会有这个异常,2.6以后己经是IOError的子类。

    socket.herror  地址相关的错误,如gethostbyname_ex()和gethostbyaddr()调用。

    socket.gaierror  地址相关的错误,如getaddrinfo()和getnameinfo()。

    socket.timeout  使用settimeout()调用的socket对象操作可以会出现这个错误。

socket模块中用于创建套接字的函数是socket(),语法是socket(socket_family,socket_type,protocol=0)

    socket_family可以是AF_UNIX或是AF_INET(AF_UNIX, AF_INET, AF_INET6是Python 支持的套接字家族),socket_type可以是SOCK_STREAM或是SOCK_DGRAM,protocol一般情况下是不填的,默认为0。

下面看看socket模块的使用方法:

类方法说明
    socket.socket(family, type)
        创建并返回一个新的 socket 对象
    socket.getfqdn(name)
        将使用点号分隔的IP地址字符串转换成一个完整的域名
    socket.gethostbyname(hostname)
        将主机名解析为一个使用点号分隔的IP地址字符串
    socket.fromfd(fd, family, type)
        从现有的文件描述符创建一个socket对象

实例方法说明
    sock.bind( (adrs, port) )
        将socket绑定到一个地址和端口上
    sock.accept()
        返回一个客户机socket(带有客户机端的地址信息)
    sock.listen(backlog)
        将socket设置成监听模式,能够监听backlog外来的连接请求
    sock.connect( (adrs, port) )
        将socket连接到定义的主机和端口上
    sock.recv( buflen[, flags] )
        从socket中接收数据,最多buflen个字符
    sock.recvfrom( buflen[, flags] )
        从socket中接收数据,最多buflen个字符,同时返回数据来源的远程主机和端口号
    sock.send( data[, flags] )
        通过socket发送数据
    sock.sendto( data[, flags], addr )
        通过socket发送数据
    sock.close()
        关闭socket
    sock.getsockopt( lvl, optname )
        获得指定socket选项的值
    sock.setsockopt( lvl, optname, val )
        设置指定socket选项的值


在socket编程时,有客户端端和服务端之分,所以有些方法是在服务端使用,有些则是在客户端使用:

服务器端套接字方法
    s.bind() 绑定地址到套接字对象,地址为主机、端口对
    s.listen() 监听端口
    s.accept() 被动的阻塞式的接受连接

客户端套接字方法
    s.connect() 初始化连接
    s.connect_ex() connect()的扩展版本,出错时会返回错误码而不是抛出异常

共用套接字方法
    s.recv() 接收TCP数据
    s.send() 发送TCP数据
    s.sendall() 完整发送TCP数据
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字


阻塞式套接字方法
    s.setblocking() 设置套接字的阻塞与非阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间

面向文件的套接字的方法
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字关联的文件


普通的非套接字实例的函数
    getdefaulttimeout()返回默认的套接字超时时间(以秒为单位)。None表示不设置任何超时时间。
    gethostbyname(hostname)   将主机名(如“www.baidu.com”)转换为IPv4地址,IP地址将以字符串的形式返回
    gethostname()  返回本地机器的主机名。
    hotol(x)  将主机的32位整数转换为网络字节顺序。
    hotos(x)  将主机的16位整数转换为网络字节顺序。
    ntohl(x)   将网络的32位整数转换为主机字节顺序。
    ntohs(x)  将网络的16位整数钻换为主机字节顺序。
    inet_aton(ip_string)  将字符串形式的IP地址转换为32位二进制分组格式。
    inet_ntoa(packedip)  将以二进制分组的IP地址转换为点分十进制格式的地址。packedip是包含IP地址原始32位编码的4个字符组成的字符串。


下面是个简单的例子:

server-socket.py

#!/usr/bin/python
import socket

host='10.1.6.235'
port=1999

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print 'Socket create...'

s.bind((host,port))
print 'Socket bind complete'

s.listen(20)
print 'Socket now listening 1999 port'

while 1:
    conn,addr=s.accept()
    print 'Connect with '+addr[0]+':'+str(addr[1])

    data=conn.recv(1024)
    reply='I am receive your message '+data

    if not data:
        break
    conn.sendall(reply)

conn.close()
s.close()
client-socket.py

#!/usr/bin/python
import socket

HOST='10.1.6.235'
PORT=1999

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))

message='I am send some message!'

s.sendall(message)

reply=s.recv(4096)
print reply

你可能感兴趣的:(python,socket)