Socket 編程
每種語言的後端底層都是基於socket編程,Python裏面的大概是這樣的方式:
服務器端:server.py
import socket
def handle_request(client):
buf = client.recv(1024)
print buf
client.send("Hello World!")
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 9000))
sock.listen(10)
while True:
connect, address = sock.accept()
handle_request(connect)
connect.close()
if __name__ == "__main__":
main()
客戶端:client.py
import socket
def client():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9000))
sock.send("I am client")
data = sock.recv(1024)
if __name__ == "__main__":
client()
socket 的編程思路
服務器端:
1.創建套接字,綁定套接字到本地IP與端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 9000))
2.開始監聽連接
s.listen(5)
3.進入循環,不斷接受客戶端的請求
s.accept()
4.接收傳來的數據,處理並給對方發送數據
buf = s.recv(1024)
s.send("Hello")
5.傳輸完成,關閉連接
s.close()
客戶端:
1.創建套接字,連接遠端地址
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 9000))
2.連接後發送數據並接收數據
s.send("Hello")
buf = s.recv(1024)
3.傳輸完畢後,關閉套接字
s.close()
select 模塊
select模塊中有select,poll,epoll三種方式實現socket編程,他們都是Linux上實現的是IO多路複用技術,可以同時監聽多個套接字。
select:
乾貨
IO多路複用 :
通過一種機制,可以監視多個描述符(socket),一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。
Linux中的 select,poll,epoll 都是IO多路複用的機制
Linux下網絡I/O使用socket套接字來通信,普通I/O模型只能監聽一個socket,而I/O多路複用可同時監聽多個socket.
I/O多路複用避免阻塞在io上,原本爲多進程或多線程來接收多個連接的消息變爲單進程或單線程保存多個socket的狀態後輪詢處理.