1. 程式人生 > >HTTP 之 套接字

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 之 套接字