Socket(套接字):
始于Unix,即人们所说的BSD Unix。socket家族有两种:基于文件系统的和基于网络的。第一种是基于文件系统的,地址家族表示为:AF_UNIX(或AF_LOCAL);第二种是网络Socket,是基于网络的,地址家族表示为AF_INET(AF_INET6表示ipv6)。
在Python 2.5 中加入了一种 Linux 套接字的支持:AF_NETLINK(无连接[见下])套接字家族让用户代码与内核代码之间的 IPC 可以使用标准 BSD 套接字接口。Python 只支持 AF_UNIX,AF_NETLINK,和 AF_INET 家族。
根据套接字类型,可以分为面向连接的和无连接的。
面向连接的,在通讯之前需建立一条连接,这种通讯方式提供了顺序的,可靠的,不会重复的数据传输,而且也不会被加上数据边界。实现这种连接的主要协议就是传输控制协议(即 TCP),其对应的套接字类型为 SOCK_STREAM。套接字使用 Internet 协议(IP)来查找网络中的主机,即TCP/IP协议来支持面向连接套接字。
无连接的,无需建立连接就可以进行通讯。实现这种连接的主要协议就是用户数据报协议(即 UDP) ,指定套接字类型为 SOCK_DGRAM。套接字使用 Internet 协议来查找网络中的主机,即UDP/IP协议来支持无连接套接字。
1. socket()模块函数
创建socket()套接字的语法如下:
socket(socket_family, socket_type, protocol=0)
socket_family一般为AF_UNIX或者AF_INET,socket_type可以是SOCK_STREAM或者SOCK_DGRAM,protocol一般不填,默认为0。
由于socket模块中有太多的属性,这里使用"from socket import *"以减少代码长度。
创建一个TCP/IP的套接字:
tcpsocket = socket(AF_INET, SOCK_STREAM)
同样的,创建一个UDP/IP的套接字:
udpsocket = socket(AF_INET, SOCK_DGRAM)
2.套接字对象方法 来自:https://blog.csdn.net/eastmount/article/details/48909861
下面是最常用的套接字对象方法:
服务器端套接字函数
socket类型 | 描述 |
s.bind() | 绑定地址(主机号 端口号对)到套接字 |
s.listen() | 开始TCP监听 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连续的到来 |
客户端套接字函数
socket类型 | 描述 |
s.connect() | 主动初始化TCP服务器连接 |
s.connect_ex() | connect()函数扩展版本,出错时返回出错码而不是跑出异常 |
公共用途的套接字函数
socket类型 | 描述 |
s.recv() | 接受TCP数据 |
s.send() | 发送TCP数据 |
s.sendall() | 完整发送TCP数据 |
s.recvfrom() | 接受UDP数据 |
s.sendto() | 发送UDP数据 |
s.getpeername() | 连接到当前套接字的远端地址(TCP连接) |
s.getsockname() | 获取当前套接字的地址 |
s.getsockopt() | 返回指定套接字的参数 |
s.setsockopt() | 设置指定套接字的参数 |
s.close() | 关闭套接字 |
面向模块的套接字函数
socket类型 | 描述 |
s.setblocking() | 设置套接字的阻塞与非阻塞模式 |
s.settimeout() | 设置阻塞套接字操作的超时时间 |
s.gettimeout() | 得到阻塞套接字操作的超时时间 |
面向文件的套接字函数
socket类型 | 描述 |
s.fileno() | 套接字的文件描述符 |
s.makefile() | 创建一个与套接字关联的文件对象 |
提示:在运行网络应用程序时,如果能够使用在不同的电脑上运行服务器和客户端最好不过,它能让你更好理解通信过程,而更多的是方位localhost或127.0.0.1.
iServer
#coding:utf-8
from socket import *
s = socket(AF_INET,SOCK_STREAM) #创建一个TCP/IP的套接字
s.bind(('',6666)) #绑定地址(主机名、端口号)到套接字
s.listen(1) #开启Tcp监听
sock,addr = s.accept() #被动接受TCP客户端连接,(阻塞式)等待连续的到来
print 'connected by ',addr
sock.send('welcome to iChunqiu') #发送TCP数据
text = sock.recv(1024) #接收TCP数据
print text
sock.close()
s.close()
iClient
#coding:utf-8
from socket import *
c = socket(AF_INET,SOCK_STREAM)
c.connect(('127.0.0.1',6666))
text = c.recv(1024)
print text
c.send('Hello iChunqiu')
c.close()