2015 12 16 第八天筆記整理 第二部分

2022-08-26 04:57:09 字數 3173 閱讀 5097

本地的程序間通訊(ipc)有很多種方式,但可以總結為下面4類:

不過這個不是重點!提問,在網路中程序之間如何通訊?

首要解決的問題是如何唯一標識乙個程序,否則通訊無從談起!在本地可以通過程序pid來唯一標識乙個程序,但是在網路中這是行不通的。其實tcp/ip協議族已經幫我們解決了這個問題,網路層的「ip位址」可以唯一標識網路中的主機,而傳輸層的「協議+埠」可以唯一標識主機中的應用程式(程序)。這樣利用三元組(ip位址,協議,埠)就可以標識網路的程序了,網路中的程序通訊就可以利用這個標誌與其它程序進行互動。

使用tcp/ip協議的應用程式通常採用應用程式設計介面:unix  bsd的套接字(socket)和unix system v的tli(已經被淘汰),來實現網路程序之間的通訊。就目前而言,幾乎所有的應用程式都是採用socket,而現在又是網路時代,網路中程序通訊是無處不在,這就是我為什麼說「一切皆socket」。

所以,在下面的理解中,我們可以把socket 簡單的理解為「ip + 協議 + 埠

其中ip就是ip位址,協議就是tcp+udp,埠範圍是1-65535

需要說明的是socket和file有類似的地方,這是因為,在發展的初期他們都是按unix的思路創造出來的,「一切皆檔案」,所以對於socket也有 讀/寫io,開啟,關閉這樣的操作。

socket和file的區別:

實現socket通常分成兩個部分

client

server

socket()

socket()

bind()

listen()

connect()

accept()

write()

read()

write()

read()

close()

close()

上:

知道了溝通過程,剩下就是語法,然後就可以開始進行socket的編寫了。

sk = socket.socket(socket.af_inet,socket.sock_stream,0)

引數一:位址簇

socket.af_inet ipv4(預設)

socket.af_inet6 ipv6

socket.af_unix 只能夠用於單一的unix系統程序間通訊

引數二:型別

socket.sock_stream  流式socket , for tcp (預設)

socket.sock_dgram   資料報式socket , for udp

socket.sock_raw 原始套接字,普通的套接字無法處理icmp、igmp等網路報文,而sock_raw可以;其次,sock_raw也可以處理特殊的ipv4報文;此外,利用原始套接字,可以通過ip_hdrincl套接字選項由使用者構造ip頭。

socket.sock_rdm 是一種可靠的udp形式,即保證交付資料報但不保證順序。sock_ram用來提供對原始協議的低階訪問,在需要執行某些特殊操作時使用,如傳送icmp報文。sock_ram通常僅限於高階使用者或管理員執行的程式使用。

socket.sock_seqpacket 可靠的連續資料報服務

引數三:協議

#

!/usr/bin/env python

#-- coding: utf-8 --

__author__ = '

echorep

'『』『

建立服務端

』『』import

socket

defmain():

#建立socket物件

sock =socket.socket(socket.af_inet, socket.sock_stream)

#監聽埠

sock.bind(('

127.0.0.1

',8001))

#開始監聽,

sock.listen(5)

while

true:

#阻塞,deng 。。。。

#直到有請求連線

print

'....

'connection, address =sock.accept()

#connection,代表客戶端socket物件,

#address,客戶端ip位址

#handle_request(connection)

buf = connection.recv(1024)

print

buf

#通過鏈結接受資料

建立客戶端

』『』import

socket

while

true:

objclient =socket.socket()

objclient.connect((

"localhost

",8001))

objclient.send(

"hihihi")

serverdate = objclient.recv(1024)

print

serverdate

objclient.close()

開課第八天

開課第八天,今天因為遲到問題被老師訓了,呵呵,說實話是真的感覺前一周有點懶散鬆懈,今天被訓之後又感覺到了緊迫感,嗯,堅持就是勝利,加油。上午講題,下午講新知識,以下就是本寶寶吸收的新養料 方法 可以被稱作函式,也可以被稱作功能。1 main 是我們學習的第乙個簡單的方法,public static ...

彙編第八天

彙編形式目標 main proc push ebp mov ebp,esp 建立堆疊框架 push offset msg 匯入引數位址 call printf 呼叫函式 xor eax,eax 返回0 pop epb 扯掉框架 ret 0 返回主程式 main endp 結束 1.條件語句 cmp ...

前端第八天

迴圈繫結的變數汙染 在進行事件迴圈變數繫結時,由於函式體內部 並未執行,在繫結結束後,呼叫函式時,賦予的部分變數失去意義,解決方案 給頁面元素新增乙個任意屬性 事件與已有的函式進行繫結 只需要將函式位址繫結給事件,事件繫結完成將會有系統在特定情況下自動觸發 物件 字典 的增刪改查 物件元素格式為字串...