網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket讲弄。
建立網(wǎng)絡(luò)通信連接至少要一對端口號(socket)。socket本質(zhì)是編程接口(API)云稚,對TCP/IP的封裝涵妥,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口乖寒;HTTP是轎車猴蹂,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機楣嘁,提供了網(wǎng)絡(luò)通信的能力磅轻。
建立一個socket必須至少有2端珍逸,一個是服務(wù)器端,一個是客戶端聋溜,服務(wù)端被動等待并接收請求谆膳,客戶端主動發(fā)起請求,連接建立后撮躁,雙方可以互發(fā)數(shù)據(jù)漱病。
socket.socket()
創(chuàng)建套接字對象必須使用socket庫的socket函數(shù),返回一個套接字對象描述符
- TCP
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) - UDP
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
套接字對象內(nèi)置方法
- 服務(wù)器套接字
s.bind() 將地址(ip把曼,port)綁定到套接字上
s.listen() 設(shè)置并啟動TCP監(jiān)聽器
s.accept() 被動接受TCP客戶端連接杨帽,一旦等待到連接到達(dá)(阻塞) - 客戶端套接字方法
s.connect() 主動發(fā)起TCP服務(wù)器連接
s.connect_next() connect()的擴展版本,此時會以錯誤碼的形式返回問題祝迂,而不是拋出一個異常 - 普通套接字方法
s.recv() 接收TCP消息
s.recv_into() 接收TCP消息到指定的緩沖區(qū)
s.send() 發(fā)送TCP消息
s.sendall() 完整的發(fā)送TCP消息
s.recvfrom() 接收UDP消息
s.recvfrom_into() 接收UDP消息到指定的緩沖區(qū)
s.sendto() 發(fā)送UDP消息
s.getpeername() 連接到套接字(TCP)的遠(yuǎn)程地址
s.getsockname() 當(dāng)前套接字的地址
s.getsockopt() 返回給定套接字選項的值
s.setsockopt() 設(shè)置給定套接字的值
s.shutdown() 關(guān)閉連接
s.close() 關(guān)閉套接字
s.detach() 在未關(guān)閉文件描述符的情況下關(guān)閉套接字睦尽,返回文件描述符
s.ioctl() 控制套接字的模式 - 面向阻塞的套接字方法
s.setbloking() 設(shè)置套接字的阻塞或非阻塞模式
s.settimeout() 設(shè)置阻塞套接字操作的超時時間
s.gettimeout() 獲取阻塞套接字操作的超時時間 - 面向文件的套接字方法
s.fileno() 套接字的文件描述符
s.makefile() 創(chuàng)建與套接字關(guān)聯(lián)的文件對象 - 數(shù)據(jù)屬性
s.family 套接字家族
s.type 套接字類型
s.proto 套接字協(xié)議
操作實例
UDP通信
#server
from socket import *
from time import ctime
HOST = ''
PORT = 8888
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpServSock = socket(AF_INET,SOCK_DGRAM)
udpServSock.bind(ADDR)
while True:
print("waiting for message...")
data,addr = udpServSock.recvfrom(BUFSIZ)
print("收到數(shù)據(jù):",data.decode("utf-8"))
data =data.decode("utf-8")
content = '[%s] %s'%(bytes(ctime(),'utf-8'),data)
udpServSock.sendto(content.encode('utf-8'),addr)
print(".........received form and return to:",addr)
#client
from socket import *
HOST = '192.168.14.52'
PROT = 8888
BUFSIZ = 1024
ADDR = (HOST,PROT)
udpcliSOCK = socket(AF_INET,SOCK_DGRAM)
while True:
data =input(">")
if not data:
break
udpcliSOCK.sendto(data.encode('utf-8'),ADDR)
data,ADDR = udpcliSOCK.recvfrom(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))
udpcliSOCK.close()
TCP通信
#server
from socket import *
server_address = ('',9000)
server_sock = socket(AF_INET,SOCK_STREAM)
server_sock.bind(server_address)
print("服務(wù)器監(jiān)聽端口%s中:"%server_address[1])
server_sock.listen(5)
try:
while True:
print("等待連接。型雳。当凡。")
client_sock,client_addr = server_sock.accept()
print("客戶端{(lán)}已連接".format(client_addr))
while True:
data = client_sock.recv(2048)
if data:
print("接受數(shù)據(jù):%s"%data.decode())
client_sock.send(data)
else:
client_sock.close()
finally:
server_sock.close()
#client
from socket import *
HOST = '192.168.14.52'
PROT = 9000
BUFSIZ = 1024
ADDR = (HOST,PROT)
socket_client = socket(AF_INET,SOCK_STREAM)
socket_client.connect(ADDR)
while True:
data = input(">")
socket_client.send(data.encode('utf-8'))
msg = socket_client.recvfrom(BUFSIZ)
print("響應(yīng):",msg[0].decode())