HTTP 之 套接字
TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。這個就像操作系統會提供標準的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。”
CSDN上有個比較形象的描述:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力,SOCKET是實現傳輸層協議的一種編程API。。
實際上,傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。
跨Internet的主機間通訊
.在建立通信連接的每一端,進程間的傳輸要有兩個標誌:
.IP地址和端口號,合稱為套接字地址socket address
套接字是服務器端和客戶端各開一個端口,由ip+端口號組成
.客戶機套接字地址定義了一個唯一的客戶進程
.服務器套接字地址定義了一個唯一的服務器進程
下圖是一個簡單的tcp的通信示例
socket套接字
.Socket:套接字,進程間通信IPC的一種實現,允許位於不同主機(或同一主機)上不同進程之間進行通信和數據交換,
.Socket API:封裝了內核中所提供的socket通信相關的系統調用,SocketAPI出現於1983年,4.2 BSD實現
.Socket Domain:根據其所使用的地址,分成了以下三類
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上不同進程之間通信時使用
.Socket Type:根據使用的傳輸層協議
SOCK_STREAM:流,tcp套接字,可靠地傳遞、面向連接
SOCK_DGRAM:數據報,udp套接字,不可靠地傳遞、無連接
SOCK_RAW:裸套接字,無須tcp或udp,APP直接通過IP包通信
套接字工作在應用層和傳輸層之間,服務器要對外提供服務要監聽套接字。
基本TCP客戶/服務器程序的套接字函數,其通信過程如下圖所示
http服務通信過程
.套接字相關的系統調用:
socket():創建一個套接字
bind():綁定IP和端口
listen():監聽
accept():接收請求
connect():請求連接建立
write():發送
read():接收
close():關閉連接
Socket通信示例
以下將通過python語言寫兩段socket間的通信,分為服務器端和客戶端的代碼。
通信示例:服務器端tcpserver.py
tcpserver.py,以下的listen是python封裝過的函數,和系統的listen不一樣,但是調用了系統的listen函數
#coding=utf-8
#!/usr/bin/python
import socket
#導入socket代碼
HOST=‘127.0.0.1‘
#定義變量,HOST,PORT,BUFFER
PORT=9527
#這裏的端口,如果是1023以下的端口為特權端口,只能是root使用
BUFFER=4096
#定義緩存大小
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#定義函數socket,通過socket創建對象socket,指定了參數,如socket.AF_INET,是ipv4,socket.SOCK_STREAM表示是tcp協議,>表示創建了一個對象是基於TCP協議的ipv4的socket
sock.bind((HOST,PORT))
#綁定具體的ip地址和端口號
sock.listen(3)
#監聽
print(‘tcpServer listen at: %s:%s\n\r‘ %(HOST,PORT))
while True:
#這裏是死循環,一直監聽,以下的語句時python語句,python語法要求以下語句一定要縮進
client_sock,client_addr=sock.accept()
print(‘%s:%s connect‘ %client_addr)
while True:
recv=client_sock.recv(BUFFER)
if not recv:
client_sock.close()
break
print(‘[Client %s:%s said]:%s‘ %(client_addr[0],client_addr[1],recv))
client_sock.send(‘tcpServer has received your message‘)
sock.close()
註意。python要顯示中文註釋,需要在腳本第一行寫上#coding=utf-8 ,另外語法有縮進的要求,以上代碼,縮進部分如下圖
通信示例:客戶端tcpclient.py
#coding=utf-8
#!/usr/bin/python
import socket
HOST=‘127.0.0.1‘
#這裏只需要將host對應的ip改成遠程主機的ip,就可以給遠程主機發消息,進行通信
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send(‘hello, tcpServer!‘)
recv=sock.recv(BUFFER)
print(‘[tcpServer said]: %s‘ % recv)
sock.close()
本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1970525
HTTP 之 套接字