? ? ? ? python中涉及到兩種套接字分別為AF_UNIX基于文件的和AF_INET基于網(wǎng)絡的,為支持ipv6還引入了AF_INET6,python2.5后引入了AF_NETLINK無連接。套接字讀端口的使用范圍是0- 5535,小于1024的端口默認為系統(tǒng)服務保留,linux、unix系統(tǒng)/etc/service文件中有對默認端口對應服務的映射表。
文件部分內(nèi)容如下:

socket可以分為面向連接的和無連接的,面向連接的又稱為流套接字,面向連接的套接字使用tcp協(xié)議,套接字類型為SOCK_STREAM,面向無連接的套接字,使用數(shù)據(jù)包形式進行通信,使用udp協(xié)議,套接字類型為SOCK_DGRAM。
PYTHON中實現(xiàn)網(wǎng)絡編程主要使用socket模塊,模塊中socket用來創(chuàng)建套接字,套接字使用自己的函數(shù)提供基于套接字的網(wǎng)絡通信。
socket()模塊函數(shù):
socket函數(shù)創(chuàng)建套接字語法如下:
socket(socket_family,socket_type,protocol=0)
socket_family:不是AF_VNIX就是AV_INET
socket_type:可以是SOCK_STREAM流方式,也可以是SOCK_DGRAM
PROTOCOL:一般不用填?
套接字的內(nèi)建方法較多主要分為3類服務端用的套接字函數(shù)、客戶端用的套接字函數(shù)、公共用途的套接字函數(shù)。
服務端使用的套接字函數(shù)如下:
s.bind() ? ?綁定地址(主機名、端口號)到套接字
s.listen() ?開始監(jiān)聽
s.accept() ?被動接收客戶端
客戶端套接字函數(shù)如下:
s.connect() ?主動初始化tcp服務連接
s.connect_ex() ? connect函數(shù)的擴展版本,出錯誤時返回錯誤碼,不返回異常消息
公共用途的套接字函數(shù)主要如下:
s.recv() ? 接受tcp數(shù)據(jù)
s.send() ? ?發(fā)送tcp數(shù)據(jù)
s.sendall() ? 完整發(fā)送tcp數(shù)據(jù)
s.recvfrom() ? ?接受udp數(shù)據(jù)。
s.sendto() ? ?發(fā)送udp數(shù)據(jù)
s.getpeername() ? 連接到當前套接字的遠端的地址(tcp連接)
s.getsockname() ? ?當前套接字地址
s.getsockopt() ? ?返回指定套接字的參數(shù)
s.setsockopt() ? ?設置指定套接字參數(shù)
s.close() ? ?關閉套接字
面向模塊的套接字函數(shù)如下:
s.setblocking() ? 設置套接字的阻塞與非阻塞模式
s.settimeout() ? ?設置套接字超時時間
s.gettimeout() ? ?獲取套接字超時時間
面向文件的套接字函數(shù)如下:
s.fileno() ? ?套接字文件描述
s.makefile() ? 創(chuàng)建一個與套接字關聯(lián)的文件對象
創(chuàng)建一個tcp服務器偽代碼如圖:

服務端示例代碼如下:
''' ?#!/usr/bin/env python
from socket import *
from time import ctime
HOST=''
PORT=21567
BUFSIZE=1024
ADDR=(HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print 'waiting for connectiong....'
tcpCliSock, addr = tcpSerSock.accept()
print '...connected from:', addr
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
tcpCliSock.send('[%s] %s' %s (ctime(), data))
tcpCliSock.close()
tcpSerSock.close() ?'''
?代碼運行后開啟端口監(jiān)聽,等待客戶端連接,如下圖:

創(chuàng)建一個客戶端代碼連接服務端,代碼如下:
#!/usr/bin/env python
from socket import *
HOST='127.0.0.1'
PORT=21567
BUFSIZE=1024
ADDR=(HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input('please input >')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print data
tcpCliSock.close()
運行效果如圖:
